| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // Flags: --harmony-classes |
| |
| |
| (function TestSuperNamedLoads() { |
| function Base() { } |
| function Derived() { |
| this.derivedDataProperty = "xxx"; |
| } |
| Derived.prototype = Object.create(Base.prototype); |
| |
| function fBase() { return "Base " + this.toString(); } |
| |
| Base.prototype.f = fBase.toMethod(Base.prototype); |
| |
| function fDerived() { |
| assertEquals("Base this is Derived", super.f()); |
| assertEquals(15, super.x); |
| assertEquals(27, this.x); |
| |
| return "Derived" |
| } |
| |
| Base.prototype.x = 15; |
| Base.prototype.toString = function() { return "this is Base"; }; |
| Derived.prototype.toString = function() { return "this is Derived"; }; |
| Derived.prototype.x = 27; |
| Derived.prototype.f = fDerived.toMethod(Derived.prototype); |
| |
| assertEquals("Base this is Base", new Base().f()); |
| assertEquals("Derived", new Derived().f()); |
| }()); |
| |
| (function TestSuperKeywordNonMethod() { |
| function f() { |
| super.unknown(); |
| } |
| |
| assertThrows(f, ReferenceError); |
| }()); |
| |
| |
| (function TestGetter() { |
| function Base() {} |
| var derived; |
| Base.prototype = { |
| constructor: Base, |
| get x() { |
| assertSame(this, derived); |
| return this._x; |
| }, |
| _x: 'base' |
| }; |
| |
| function Derived() {} |
| Derived.__proto__ = Base; |
| Derived.prototype = { |
| __proto__: Base.prototype, |
| constructor: Derived, |
| _x: 'derived' |
| }; |
| Derived.prototype.testGetter = function() { |
| return super.x; |
| }.toMethod(Derived.prototype); |
| derived = new Derived(); |
| assertEquals('derived', derived.testGetter()); |
| }()); |
| |
| /* |
| * TODO[dslomov]: named stores and keyed loads/stores not implemented yet. |
| (function TestSetter() { |
| function Base() {} |
| Base.prototype = { |
| constructor: Base, |
| get x() { |
| return this._x; |
| }, |
| set x(v) { |
| this._x = v; |
| }, |
| _x: 'base' |
| }; |
| |
| function Derived() {} |
| Derived.__proto__ = Base; |
| Derived.prototype = { |
| __proto__: Base.prototype, |
| constructor: Derived, |
| _x: 'derived' |
| }; |
| Derived.prototype.testSetter = function() { |
| super.x = 'foobar'; |
| }.toMethod(Derived.prototype); |
| var d = new Derived(); |
| d.testSetter(); |
| assertEquals('base', Base.prototype._x); |
| assertEquals('foobar', d._x); |
| }()); |
| |
| |
| (function TestKeyedGetter() { |
| function Base() {} |
| Base.prototype = { |
| constructor: Base, |
| _x: 'base' |
| }; |
| |
| Object.defineProperty(Base.prototype, '0', |
| { get: function() { return this._x; } }); |
| |
| function Derived() {} |
| Derived.__proto__ = Base; |
| Derived.prototype = { |
| __proto__: Base.prototype, |
| constructor: Derived, |
| _x: 'derived' |
| }; |
| Derived.prototype.testGetter = function() { |
| return super[0]; |
| }.toMethod(Derived.prototype); |
| assertEquals('derived', new Derived()[0]); |
| // assertEquals('derived', new Derived().testGetter()); |
| }()); |
| */ |