继承父类构造函数的参数

35

我正在浏览类似话题的讨论,但找不到适合我的情况...

我试图调用带参数的父级构造函数... 但好像无法搞定。

我有一个PhysicsBody超类,它以aNode作为唯一的构造函数参数:

function PhysicsBody(aNode) {
    this.userData = aNode;
    // ...
}

这个 PhysicsBody 类继承了一个 DynamicBody 类。它的构造函数也只接受 aNode 作为参数......就像我在Java中所做的那样,我希望调用与"super(aNode"); 相当的东西。但是似乎找不到如何实现。

这是DynamicBody类的定义:

// Wanted to give "new PhysicsBody(this, aNode)", but that fails!
DynamicBody.prototype = new PhysicsBody();
DynamicBody.prototype.constructor=DynamicBody;

function DynamicBody(aNode) {

    // calling the parent constructor fails too:
    // PhysicsBody.prototype.constructor.call(this, aNode);
    //...
}
2个回答

57

一种做法:

function PhysicsBody( aNode ) {
    this.userData = aNode;
}

PhysicsBody.prototype.pbMethod = function () {};

function DynamicBody( aNode ) {
    PhysicsBody.call( this, aNode );
}

// setting up the inheritance
DynamicBody.prototype = Object.create( PhysicsBody.prototype );

DynamicBody.prototype.dbMethod = function () {};

现在,当您执行以下操作时:
var pb = new PhysicsBody( '...' );

实例对象 pb 获取了一个 userData 属性,并且继承了 PhysicsBody.prototype 中的方法(在本例中是 pbMethod)。


当你这样做时:

var db = new DynamicBody( '...' );

实例db获取了一个userData属性,并继承了DynamicBody.prototype的方法(在这种情况下是dbMethod),而DynamicBody.prototype又继承自PhysicsBody.prototype


太棒了!这个问题困扰我很久了,但它竟然如此简单.. 自我抽耳光 - Lars-Erik
然后我们只剩下10年的等待期,在此之前所有预v6的浏览器都将消失。 :) 我仍然更喜欢这种“派生类”的方式,而不是各种扩展函数等(至少目前是这样)。 - Lars-Erik
谢谢你的提示,我会看一下的。 :) - Lars-Erik
我仍然不明白它是如何工作的 - 为什么DynamicBody是PhysicsBody的一个实例?它们都继承自Object,但它们彼此之间并没有相互继承!(假设PhysicsBody.prototype指向一个通用的Object...) - Novellizator
为什么我们需要执行 DynamicBody.prototype = Object.create( PhysicsBody.prototype ); 而不是只执行 DynamicBody.prototype = PhysicsBody.prototype; ?- 编辑:啊,这样做是为了在向 DynamicBody 的原型添加方法时不覆盖父级原型。 - mclaassen
显示剩余2条评论

10
如果我理解正确,您想继承父类构造函数的参数,这意味着new DynamicBody(1, 2, 3)将在内部为DynamicBody实例调用PhysicsBody(1, 2, 3)

可以通过使用.apply并传递arguments来实现:http://jsfiddle.net/pmkrQ/
function DynamicBody() {
    PhysicsBody.apply(this, arguments);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接