【问题标题】:Why is `instanceof` producing different results? [duplicate]为什么“instanceof”会产生不同的结果? [复制]
【发布时间】:2019-02-23 11:58:25
【问题描述】:

为什么instanceof操作符在以下两段代码中产生不同的结果,它是如何在幕后工作的?

1>

function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();

myobject instanceof MyConstructor 
**true**

2> 现在如果我执行以下代码,结果会有所不同:

MyConstructor.prototype = {};
myobject instanceof MyConstructor 

**false**

你能解释一下 operator 的实例是如何工作的吗?我了解原型继承在 javascript 中是如何工作的,但我无法理解这个场景。

【问题讨论】:

  • 因为{} !== {}
  • @bergi 肯定有。 jsfiddle.net/7phcL3qm。用不同的东西覆盖原型会导致这种行为......

标签: javascript prototype instanceof


【解决方案1】:

instanceof 运算符测试构造函数的原型属性是否出现在对象原型链中的任何位置。

因此,如果您重新分配原型,myobject 的原型将不会是 === 到(新的)MyConstructor.prototype,因此 instanceof 解析为 false。

function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();

console.log(myobject instanceof MyConstructor);
console.log(Object.getPrototypeOf(myobject) === MyConstructor.prototype);

MyConstructor.prototype = {};
console.log(myobject instanceof MyConstructor);
console.log(Object.getPrototypeOf(myobject) === MyConstructor.prototype);

【讨论】:

  • 但是由于我们在这两种情况下都将一个空对象分配为原型,它如何知道前一个空对象是正确的原型而不是后者呢?我有点想知道它在幕后是如何运作的
  • 它会在您使用instanceof MyConstructor 时检查MyConstructor.prototype。使用您刚刚发布的代码,原型始终相同(=== 到 foo),因此 instanceof 始终解析为 true。
  • 当我在 chrome 开发工具中输出 MyConstructor.prototype 时,我看到一个以 proto 作为对象的空对象。它怎么知道它是正确的原型
  • Javascript 内部知道foo 引用内存中与MyConstructor.prototype 相同的对象,这与Object.getPrototypeOf(myobject) 相同,因此instanceof 始终解析为true。跨度>
猜你喜欢
  • 1970-01-01
  • 2018-12-30
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多