【问题标题】:Inherit parent constructor arguments继承父构造函数参数
【发布时间】:2011-12-08 19:32:58
【问题描述】:

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

我正在尝试使用参数调用父构造函数...似乎无法正确处理。

我有一个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);
    //...
}

【问题讨论】:

    标签: javascript inheritance constructor arguments


    【解决方案1】:

    一种方法:

    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)继承方法,而PhysicsBody.prototype 又继承自PhysicsBody.prototype

    【讨论】:

    • 太棒了!这自古以来就迷惑了我,但它是如此简单.. 打脸
    • @Lars-Erik 老实说,这是一团糟:-)。即将发布的 JavaScript (ECMAScript 6) 将带来类语法,这将使这种模式更加简单。
    • 那么我们只剩下 10 年的等待期,所有 pre v6 的浏览器都死了。 :) 我仍然比各种扩展函数等更喜欢这种“派生类”的方式。(至少现在)
    • @Lars-Erik今天随时开始使用带有 ES6 到 Es5 转译器的 ES6 类。您可以在浏览器中或之前使用例如一个 Grunt 任务npmjs.org/package/grunt-traceur
    • 感谢您的提示。会看看。 :)
    【解决方案2】:

    如果我理解正确的话,说你想继承父构造函数参数,你的意思是new DynamicBody(1, 2, 3) 将在内部为DynamicBody 实例调用PhysicsBody(1, 2, 3)

    这可以通过使用.apply 并传递arguments 来完成:http://jsfiddle.net/pmkrQ/

    function DynamicBody() {
        PhysicsBody.apply(this, arguments);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2021-05-30
      • 1970-01-01
      • 2013-06-01
      相关资源
      最近更新 更多