super-prop.js (1399B)
1 class Y { 2 a() { 3 assertEq(this.__proto__, X.prototype); 4 return 1; 5 } 6 b() { 7 assertEq(this.__proto__, X.prototype); 8 return 2; 9 } 10 } 11 12 class X extends Y { 13 a() { throw "not invoked"; } 14 b() { 15 return super.a() + super.b(); 16 } 17 c(i) { 18 var a, b; 19 20 if (i % 2) { 21 a = "a"; 22 b = "b" 23 } else { 24 a = "b"; 25 b = "a"; 26 } 27 28 return super[a]() + super[b](); 29 } 30 } 31 32 function simple() { 33 var x = new X(); 34 assertEq(x.b(), 3); 35 assertEq(x.c(), 3); 36 } 37 38 class A { 39 b() { return 1;} 40 } 41 class B extends A { 42 a() { 43 assertEq(super.b(), 1); 44 } 45 } 46 47 function nullHomeObjectSuperBase(i) { 48 var b = new B(); 49 if (i == 500) { 50 Object.setPrototypeOf(B.prototype, null); 51 // Don't crash 52 } 53 b.a(); 54 } 55 56 class SArray extends Array { 57 constructor() { 58 super("a", "b"); 59 } 60 61 a() { 62 assertEq(super.length, 0); 63 assertEq(this.length, 2); 64 65 assertEq(this[0], "a"); 66 assertEq(this[1], "b"); 67 68 assertEq(super[0], undefined); 69 assertEq(super[1], undefined); 70 } 71 } 72 73 function array() { 74 var s = new SArray(); 75 s.a(); 76 } 77 78 for (var i = 0; i < 1e4; i++) { 79 simple(); 80 array(); 81 82 try { 83 nullHomeObjectSuperBase(i); 84 } catch (e) { 85 assertEq(i >= 500, true); 86 } 87 }