我想知道是否可以在
javascript中继承构造函数.在下面的例子中,我希望Moveable能够将x和y参数分配给this.x和this.y,就像我在Sprite中定义的那样.此外,在没有创建祖先的情况下定义原型的最佳方式(但仍然简短且可读)是什么?最好将它分配给类本身,而不是像现在这样在外部范围中分配:
function Sprite(x,y) { this.x = x ? x : 0; this.y = y ? y : 0; this.getPos = function() { return { x: this.x,y: this.y }; }; } function Moveable(x,y) { } Moveable.prototype = new Sprite();
解决方法
调用超类构造函数的标准方法是使用
Function.call
:
function Moveable(x,y) { Sprite.call(this,x,y); }
至于原型,你可以做这样的事情来链接原型而不创建超类的实例:
function makePrototype(superclass) { function f() { } f.prototype = superclass.prototype; return new f(); } Moveable.prototype = makePrototype(Sprite);
这使用虚拟构造函数来创建一个与Sprite共享相同原型的对象,因为这是所有JavaScript关心的,所以Moveable的实例被认为是Sprite的实例.
这不是你所要求的“简短和可读”,但唯一的另一种选择是完全跳过原型并直接在构造函数中分配成员.
编辑:正如@Raynos指出的那样,您还需要设置构造函数属性(默认情况下由JavaScript完成,但一旦重置Moveable.prototype就会丢失):
Moveable.prototype.constructor = Moveable;