DOJO多重继承时调用superclass构造函数

Call super class constructor when multiple inheritance in DOJO

我有一个对象继承自其他 2 个对象。

我正在使用手动调用构造函数,因为我想操纵我发送到超级的参数 类(参见 '-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... 时,超级 类 构造函数被调用但没有我的参数操作。

找到解决方法

我们编写

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

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

恐怕没有道场的方法。自动构造函数继承的主要优点是它会调用所有的构造函数。

但是,如果您将其设置为手动,那么它将调用last继承class的构造函数在列表中。在您的情况下,将调用 base2 的构造函数,但不会调用 base1.

的构造函数

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

覆盖

编辑:

如果你不想自己手动调用所有基础class的构造函数,你可以创建一个循环。所有基本构造函数实际上都可以在元对象中使用。这有点 hacky,但是 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);
    }
};

然后你可以这样使用它:

constructor: function(name) {
    inheritAllConstructors(this, ["custom", "arguments"]);
},

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