| function assert(b) { |
| if (!b) |
| throw new Error("Bad assertion") |
| } |
| |
| function test(f, n = 1000) { |
| for (let i = 0; i < n; ++i) |
| f(); |
| } |
| |
| let o1 = { |
| get foo() { |
| return this; |
| } |
| }; |
| |
| let o2 = { |
| __proto__: o1, |
| a() { |
| "use strict"; |
| return super.foo; |
| }, |
| |
| aa() { |
| "use strict"; |
| let arr = () => super.foo; |
| return arr(); |
| } |
| }; |
| |
| var A = o2.a; |
| var AA = o2.aa; |
| |
| let globalObj = this; |
| |
| AA(); |
| |
| test(function() { |
| let num = o2.a.call(25); |
| assert(typeof num === "object"); |
| assert(num instanceof Number); |
| |
| let str = o2.a.call("foo bar"); |
| assert(typeof str === "object"); |
| assert(str instanceof String); |
| assert(str == "foo bar"); |
| |
| let o = {}; |
| assert(o2.a.call(o) === o); |
| |
| assert(A() === globalObj); |
| assert(AA() === globalObj); |
| |
| assert(o2.a.call(undefined) === globalObj); |
| assert(o2.a.call(null) === globalObj); |
| assert(o2.aa.call(undefined) === globalObj); |
| assert(o2.aa.call(null) === globalObj); |
| }); |