为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript原型继承和“instanceof”

Javascript原型继承和“instanceof”

千万里不及你 2023-07-20 16:25:50
我只是无法理解,为什么在对象继承中“instanceof”无法将“子”对象评估为父原型的实例。例如:function Parent(property) {    this.property = property;}function Child(property) {    Parent.call(property);}const child = new Child("");console.log(child instanceof Child); // of course, trueconsole.log(child instanceof Parent); // false. But why???至于类的继承(或者说JS中被认为是类的东西),情况就不同了:class Parent {    constructor(property) {        this.property = property;    }}class Child extends Parent {    constructor(property) {        super(property);    }}const child = new Child("");console.log(child instanceof Child); // trueconsole.log(child instanceof Parent); // also true!!!造成这种差异的原因是什么?是否可以创建子对象,以便将它们正确地识别为其父原型的实例(无需求助于类)?
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

你的第一个例子很简单,与 Javascript 中“原型继承”的工作方式相差甚远。

一方面,Parent.call(property)这肯定不是你的意思。此调用Parent将其this设置为property,并且没有传递任何参数,这绝对不是您想要的。我怀疑你的意思是Parent.call(this, property)- 它调用Parentthis传递给相同的内容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 类“幕后”发生的事情。

查看完整回答
反对 回复 2023-07-20
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信