Source code

Revision control

Copy as Markdown

Other Tools

// The prototype of a class is a non-writable, non-configurable, non-enumerable data property.
class a { constructor() { } }
let b = class { constructor() { } };
for (let test of [a,b]) {
var protoDesc = Object.getOwnPropertyDescriptor(test, "prototype");
assertEq(protoDesc.writable, false);
assertEq(protoDesc.configurable, false);
assertEq(protoDesc.enumerable, false);
var prototype = protoDesc.value;
assertEq(typeof prototype, "object");
assertEq(Object.getPrototypeOf(prototype), Object.prototype);
assertEq(Object.isExtensible(prototype), true);
var desiredPrototype = {};
Object.defineProperty(desiredPrototype, "constructor", { writable: true,
configurable: true,
enumerable: false,
value: test });
assertDeepEq(prototype, desiredPrototype);
}
// As such, it should by a TypeError to try and overwrite "prototype" with a
// static member. The only way to try is with a computed property name; the rest
// are early errors.
assertThrowsInstanceOf(() => eval(`
class a {
constructor() { };
static ["prototype"]() { }
}
`), TypeError);
assertThrowsInstanceOf(() => eval(`
class a {
constructor() { };
static get ["prototype"]() { }
}
`), TypeError);
assertThrowsInstanceOf(() => eval(`
class a {
constructor() { };
static set ["prototype"](x) { }
}
`), TypeError);
assertThrowsInstanceOf(() => eval(`(
class a {
constructor() { };
static ["prototype"]() { }
}
)`), TypeError);
assertThrowsInstanceOf(() => eval(`(
class a {
constructor() { };
static get ["prototype"]() { }
}
)`), TypeError);
assertThrowsInstanceOf(() => eval(`(
class a {
constructor() { };
static set ["prototype"](x) { }
}
)`), TypeError);
if (typeof reportCompare === "function")
reportCompare(0, 0, "OK");