假设我有以下“类树”:
Element
/ \
/ \
/ \
Positionnable Sizeable
\ /
\ /
\ /
Rectangle
现在说元素构造函数做了一些事情:
var Element = function() {
this.traits = [ ];
};
并且说子类构造函数需要在做自己的工作之前调用它们的父构造函数(元素构造函数):
var Positionnable = function() {
Element.call( this );
this.traits.position = { x : 0, y : 0 }; // Requires this.traits to be set.
};
var Sizable = function() {
Element.call( this );
this.traits.size = { w : 0, h : 0 }; // Requires this.traits to be set.
};
问题是,当我让 Rectangle 从 Positionnable 和 Sizable 继承时(通过合并原型),来自 Element 的构造函数将被调用两次,这可能是一个问题,具体取决于它的作用:
var Rectangle = function() {
Positionnable.call( this ); // Calls Element constructor
Sizeable.call( this ); // Calls Element constructor
};
所以我想到了两种可能性:在某个地方添加布尔值,当调用构造函数时将其设置为 true 以避免多次执行此操作,但这看起来很脏。
或者我可以调用 Rectangle 中的所有直接或间接父构造函数:
var Positionnable = function() {
this.traits.position = { x : 0, y : 0 }; // Assumes parent constructor has been called
};
var Sizable = function() {
this.traits.size = { w : 0, h : 0 }; // Assumes parent constructor has been called
};
var Rectangle = function() {
Element.call( this );
Positionnable.call( this ); // Does no longer call Element constructor
Sizeable.call( this ); // Does no longer call Element constructor
};
但这会假设 Element 构造函数在 Positionnable 和 Sizable 构造函数之前调用(这意味着这两个在单独调用时会失败),这也将涉及(对于编码器)递归查找所有直接或间接父类来调用它们的构造函数(如果继承树比这更复杂,可能会很烦人),如果我需要为 Rectangle 创建一个子类,我会遇到和现在一样的问题。
那么我怎么能只调用一次构造函数呢?