| // This is super weird. A super property reference in the spec contains two |
| // things. The first is the object to do the lookup on, the super base. This |
| // should be unchanged, no matter what's going on: I can move the method to |
| // another object. I can pull it out as its own function. I can put it on my |
| // head and run around the front yard. No changes. The other half, the |this| |
| // for invoked calls, is the this at the time of referencing the property, which |
| // means it's gonna vary wildly as stuff gets moved around. |
| |
| class base { |
| constructor() { } |
| test(expectedThis) { assertEq(this, expectedThis); } |
| } |
| |
| class derived extends base { |
| constructor() { super(); } |
| test(expected) { super.test(expected); } |
| testArrow() { return (() => super.test(this)); } |
| ["testCPN"](expected) { super.test(expected); } |
| } |
| |
| let derivedInstance = new derived(); |
| derivedInstance.test(derivedInstance); |
| derivedInstance.testCPN(derivedInstance); |
| |
| let obj = { test: derivedInstance.test }; |
| obj.test(obj); |
| |
| let testSolo = derivedInstance.test; |
| // Hah! The engine is not prepared for non-object receivers, since this couldn't |
| // happen before. Hope Waldo fixes this soon as he claims he will :) |
| assertThrowsInstanceOf(() =>testSolo(undefined), TypeError); |
| |
| let anotherObject = { }; |
| derivedInstance.test.call(anotherObject, anotherObject); |
| |
| let strThis = "this is not an object!"; |
| derivedInstance.test.call(strThis, strThis); |
| |
| // You can take the arrow function out of the super, ... or something like that |
| let arrowTest = derivedInstance.testArrow(); |
| arrowTest(); |
| |
| // There's no magic "super script index" per code location. |
| class base1 { |
| constructor() { } |
| test() { return "llama"; } |
| } |
| class base2 { |
| constructor() { } |
| test() { return "alpaca"; } |
| } |
| |
| let animals = []; |
| for (let exprBase of [base1, base2]) |
| new class extends exprBase { |
| constructor() { super(); } |
| test() { animals.push(super["test"]()); } |
| }().test(); |
| assertDeepEq(animals, ["llama", "alpaca"]); |
| |
| if (typeof reportCompare === 'function') |
| reportCompare(0,0,"OK"); |