Skip to content

Commit 7d1c477

Browse files
committed
Class methods should be non enumerable
Fixes google#1873
1 parent a7cdb87 commit 7d1c477

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed

src/runtime/classes.js

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,31 +63,37 @@ function superSet(self, homeObject, name, value) {
6363
throw $TypeError(`super has no setter '${name}'.`);
6464
}
6565

66+
function forEachPropertyKey(object, f) {
67+
getOwnPropertyNames(object).forEach(f);
68+
getOwnPropertySymbols(object).forEach(f);
69+
}
70+
6671
function getDescriptors(object) {
6772
var descriptors = {};
68-
var names = getOwnPropertyNames(object);
69-
for (var i = 0; i < names.length; i++) {
70-
var name = names[i];
71-
descriptors[name] = $getOwnPropertyDescriptor(object, name);
72-
}
73-
var symbols = getOwnPropertySymbols(object);
74-
for (var i = 0; i < symbols.length; i++) {
75-
var symbol = symbols[i];
76-
descriptors[$traceurRuntime.toProperty(symbol)] =
77-
$getOwnPropertyDescriptor(object, $traceurRuntime.toProperty(symbol));
78-
}
73+
forEachPropertyKey(object, (key) => {
74+
descriptors[key] = $getOwnPropertyDescriptor(object, key);
75+
descriptors[key].enumerable = false;
76+
});
7977
return descriptors;
8078
}
8179

80+
var nonEnum = {enumerable: false};
81+
82+
function makePropertiesNonEnumerable(object) {
83+
forEachPropertyKey(object, (key) => {
84+
$defineProperty(object, key, nonEnum);
85+
});
86+
}
87+
8288
// The next three functions are more or less identical to
8389
// ClassDefinitionEvaluation in the ES6 draft.
8490

8591
function createClass(ctor, object, staticObject, superClass) {
8692
$defineProperty(object, 'constructor', {
8793
value: ctor,
88-
configurable: true,
89-
enumerable: false,
90-
writable: true
94+
configurable: true,
95+
enumerable: false,
96+
writable: true
9197
});
9298

9399
if (arguments.length > 3) {
@@ -96,6 +102,7 @@ function createClass(ctor, object, staticObject, superClass) {
96102
ctor.prototype = $create(getProtoParent(superClass),
97103
getDescriptors(object));
98104
} else {
105+
makePropertiesNonEnumerable(object)
99106
ctor.prototype = object;
100107
}
101108
$defineProperty(ctor, 'prototype', {configurable: false, writable: false});

test/feature/Classes/Method.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ var keys = [];
1313
for (var key in universe) {
1414
keys.push(key);
1515
}
16-
assert.isTrue(keys.indexOf('answer') !== -1);
17-
assert.isTrue(keys.indexOf('constructor') === -1);
16+
assert.equal(keys.indexOf('answer'), -1);
17+
assert.equal(keys.indexOf('constructor'), -1);
1818

1919
for (var key in Universe) {
2020
fail('Universe contains static member : ' + key);

test/feature/Classes/NonEnum.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class B {
2+
a() {}
3+
get b() {}
4+
set c(v) {}
5+
static d() {}
6+
static get e() {}
7+
static set f(v) {}
8+
}
9+
10+
class D extends B {
11+
g() {}
12+
get h() {}
13+
set i(v) {}
14+
static j() {}
15+
static get k() {}
16+
static set l(v) {}
17+
}
18+
19+
assert.equal(0, Object.keys(B).length);
20+
assert.equal(0, Object.keys(B.prototype).length);
21+
22+
assert.equal(0, Object.keys(D).length);
23+
assert.equal(0, Object.keys(D.prototype).length);

test/feature/NumericLiteral/Simple.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,6 @@
8383
static get 0O12() {}
8484
static set 0O13(v) {}
8585
}
86-
assertArrayEquals(['0', '1', '2', '6', '7', '8'], Object.keys(C.prototype));
87-
assertArrayEquals(['3', '4', '5', '9', '10', '11'], Object.keys(C));
86+
assertArrayEquals([], Object.keys(C.prototype));
87+
assertArrayEquals([], Object.keys(C));
8888
})();

0 commit comments

Comments
 (0)