Source code
Revision control
Copy as Markdown
Other Tools
// |reftest|
// Returns the argument in the constructor to allow stamping private fields into
// arbitrary objects.
class OverrideBase {
constructor(o) {
return o;
}
};
class A extends OverrideBase {
#a = 1;
g() {
return this.#a
}
static gs(o) {
return o.#a;
}
static inca(obj) {
obj.#a++;
}
}
var obj = {};
Object.seal(obj);
new A(obj); // Add #a to obj, but not g.
assertEq('g' in obj, false);
assertEq(A.gs(obj), 1);
A.inca(obj);
assertEq(A.gs(obj), 2);
// Ensure that the object remains non-extensible
obj.h = 'hi'
assertEq('h' in obj, false);
Object.freeze(obj);
A.inca(obj); // Despite being frozen, private names are modifiable.
assertEq(A.gs(obj), 3);
assertEq(Object.isFrozen(obj), true);
var proxy = new Proxy({}, {});
assertEq(Object.isFrozen(proxy), false);
new A(proxy);
assertEq(A.gs(proxy), 1);
// Note: this doesn't exercise the non-native object
// path in TestIntegrityLevel like you might expect.
//
// For that see below.
Object.freeze(proxy);
assertEq(Object.isFrozen(proxy), true);
A.inca(proxy);
assertEq(A.gs(proxy), 2)
var target = { a: 10 };
Object.freeze(target);
new A(target);
assertEq(Object.isFrozen(target), true)
var getOwnKeys = [];
var proxy = new Proxy(target, {
getOwnPropertyDescriptor: function (target, key) {
getOwnKeys.push(key);
return Reflect.getOwnPropertyDescriptor(target, key);
},
});
Object.isFrozen(proxy);
assertEq(getOwnKeys.length, 1);
if (typeof reportCompare === 'function') reportCompare(0, 0);