我一直无法找到答案。JavaScript 中的对象有一个继承链;任何函数Function => Object
的链是 ,is 的实例的链,以及TypeError
isTypeError => Error => Object
的链TypeError
,奇怪的是,Function => Function => Object
。
除了直接构造函数之外,我还查找了如何使构造对象从另一个函数继承属性,期望得到的继承链是这样object => constructor => second function
的,并且这是一个构造函数扩展另一个构造函数的方式。我找到的解决方案是<second function>.<call or apply>(this[, optional arguments...])
在构造函数的主体内调用,但object instanceof <second function>
最终返回false
.
进一步的研究揭示了大多数使用类语法的答案 or Object.create
,但这些都是新的,并且自 JavaScript 语言创建以来,一个“类”扩展了另一个在 JavaScript 中的“类”就已经存在,因此还有其他一些方法可以做到这一点。这些信息应该与 JavaScript 构造函数的基本解释一起提到,但事实并非如此。扩展“类”(不是实际的类语法)导致更深的继承链的主要方法是什么?
示例结果:
// Square is the subclass
// Rectangle is the superclass
var rectangle = new Rectangle(1, 1);
var square = new Square(1);
rectangle instanceof Rectangle; // true
rectangle instanceof Square; // false
square instanceof Rectangle; // true
square instanceof Square; // true
Square instanceof Rectangle; // true
错误的解决方案:
function F () {
this.value = 0;
}
function G () {
F.apply(this);
}
var f = new F();
var g = new G();
// g gets the same properties from F that f gets.
"value" in f; // true
"value" in g; // true
// But neither g nor G are instances of F.
g instanceof G; // true
g instanceof F; // false
G instanceof F; // false