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每种方法只能有一个,所以如果base1
和base2
都有相同的方法,那么它将按照您提供继承数组的相同顺序覆盖它们。这意味着它将首先包含 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/
我有一个对象继承自其他 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每种方法只能有一个,所以如果base1
和base2
都有相同的方法,那么它将按照您提供继承数组的相同顺序覆盖它们。这意味着它将首先包含 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/