diff options
Diffstat (limited to 'js/src/tests/non262/class/superPropSkips.js')
-rw-r--r-- | js/src/tests/non262/class/superPropSkips.js | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/js/src/tests/non262/class/superPropSkips.js b/js/src/tests/non262/class/superPropSkips.js new file mode 100644 index 0000000000..c9587c72f1 --- /dev/null +++ b/js/src/tests/non262/class/superPropSkips.js @@ -0,0 +1,45 @@ +// 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"); |