1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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");
|