1 回答
TA贡献1797条经验 获得超4个赞
你的第一个例子很简单,与 Javascript 中“原型继承”的工作方式相差甚远。
一方面,Parent.call(property)
这肯定不是你的意思。此调用Parent
将其this
设置为property
,并且没有传递任何参数,这绝对不是您想要的。我怀疑你的意思是Parent.call(this, property)
- 它调用Parent
与this
传递给相同的内容Child
,并传递property
参数。但这与“继承”无关。
instanceof运算符只是检查对象的“原型链”,以查看相关对象(prototype
您正在测试的“类”的属性)是否出现在任何位置。操纵对象影响instanceof
操作者的唯一方法是改变原型链。
有很多方法可以做到这一点,但“伪造”JS(ES6 之前)中基于类的继承之类的标准方法是这样的:
function Parent(property) {
this.property = property;
}
function Child(property) {
}
Child.prototype = Object.create(Parent.prototype);
const child = new Child("");
console.log(child instanceof Child);
console.log(child instanceof Parent);
它手动使从Child
委托构造的所有对象到Object.create(Parent.prototype)
,它本身就是一个从 继承的对象(否则完全是空的并且没有特殊属性)Parent.prototype
。因此,现在当instanceof
检查原型链时,它会找到它正在寻找的内容,因此返回true
,正如您从上面的代码片段中看到的那样。
当然,如果你确实想要在 JS 中基于类的继承(我个人不推荐,但肯定很流行),ES6 语法class
提供了更好的语法糖,因此你不必手动弄乱原型链如上。但请注意,这本质上就是 ES6 类“幕后”发生的事情。
添加回答
举报