// Ensure that super lookups and sets skip over properties on the |this| object. // That is, super lookups start with the superclass, not the current class. // The whole point: an empty superclass class base { constructor() { } } class derived extends base { constructor() { super(); this.prop = "flamingo"; } toString() { throw "No!"; } testSkipGet() { assertEq(super.prop, undefined); } testSkipDerivedOverrides() { assertEq(super["toString"](), Object.prototype.toString.call(this)); } testSkipSet() { // since there's no prop on the chain, we should set the data property // on the receiver, |this| super.prop = "rat"; assertEq(this.prop, "rat"); // Since the receiver is the instance, we can overwrite inherited // properties of the instance, even non-writable ones, as they could be // skipped in the super lookup. assertEq(this.nonWritableProp, "pony"); super.nonWritableProp = "bear"; assertEq(this.nonWritableProp, "bear"); } } Object.defineProperty(derived.prototype, "nonWritableProp", { writable: false, value: "pony" }); let instance = new derived(); instance.testSkipGet(); instance.testSkipDerivedOverrides(); instance.testSkipSet(); if (typeof reportCompare === 'function') reportCompare(0,0,"OK");