我有一个继承自另外两个对象的对象。
我正在使用手动调用构造函数,因为我想操作我发送给超类的参数(参见'-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的方式
答案 0 :(得分:0)
我害怕没有道场方式。自动构造函数继承的主要优点是它将调用所有构造函数。
但是,如果将其设置为手动,则仅将调用列表中最后继承类的构造函数。在您的情况下,将调用enum flags
{
FLAG0 = 0,
FLAG1 = 1,
FLAG2 = 2,
...
FLAGN = n
};
的构造函数,但不会调用base2
中的构造函数。
原因是最终,您的类只能有一种方法,所以如果base1
和base1
都有相同的方法,那么它会以相同的顺序覆盖它们你提供了继承数组。这意味着它将首先包含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/