在DOJO

时间:2015-04-22 09:46:22

标签: javascript dojo multiple-inheritance

我有一个继承自另外两个对象的对象。

我正在使用手动调用构造函数,因为我想操作我发送给超类的参数(参见'-chains-'

define([...], function(...) {
   return declare("myClass", [base1, base2],
   {
      "-chains-":
    {
        constructor: "manual"
    },

    constructor: function (params) {
        this.inherited(arguments, [ params.x, params.y, ... ]); // just for the example
    }
   });
});

问题是我在这里使用语法做错了,因为根本没有调用我的超类构造函数。

当我删除-chains-this.inherited...时,超级类构造函数被调用但没有我的参数操作。

找到解决方法

我们编写

而不是this.inherited(...)构造函数中的myClass
base1.prototype.constructor.apply(this, [paramsForBase1]);
base2.prototype.constructor.apply(this, [paramsForBase2]);

但仍然很高兴听到Dojo的方式

1 个答案:

答案 0 :(得分:0)

我害怕没有道场方式。自动构造函数继承的主要优点是它将调用所有构造函数。

但是,如果将其设置为手动,则将调用列表中最后继承类的构造函数。在您的情况下,将调用enum flags { FLAG0 = 0, FLAG1 = 1, FLAG2 = 2, ... FLAGN = n }; 的构造函数,但不会调用base2中的构造函数。

原因是最终,您的类只能有一种方法,所以如果base1base1都有相同的方法,那么它会以相同的顺序覆盖它们你提供了继承数组。这意味着它将首先包含base2,并在下一步中将被base1.constructor覆盖。

修改

如果您不想自己手动调用所有基类的构造函数,则可以创建循环。所有基础构造函数实际上都可以在元对象中使用。它有点hacky,但base2.constructor提供了所有构造函数的数组,因此您可以简单地循环它,例如:

this.constructor._meta.parents

然后你可以像这样使用它:

var inheritAllConstructors = function(object, arguments) {
    for (var idx = 0; idx < object.constructor._meta.parents.length; idx++) {
        object.constructor._meta.parents[idx].apply(object, arguments);
    }
};

可以在JSFiddle上找到完整的示例:http://jsfiddle.net/n7wnvbu1/