| // 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"); |