改变对象原型

时间:2017-12-06 05:03:53

标签: javascript

我有以下两个功能:

function Dog() {}
function Cat() {}

我设置Dog.prototype = new Cat()

然后我创建了一个dog实例:

let dog = new Dog();

为什么dog instanceof Dog === true。我理解为什么dog instanceof Cat === true,因为我只是将其设置为Cat的{​​{1}}但是当它被覆盖时,对prototype Dog的引用仍有一些提法在创建实例之前?我如何制作prototype

1 个答案:

答案 0 :(得分:1)

如MDN文档中所述

  

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

这意味着prototype将使用__proto__的{​​{1}}检查构造函数的Object属性,而不是prototype持有的值。您可以按照以下方式查看

console.log(Dog.prototype === dog.__proto__) // prints -> true
console.log(Dog.prototype === Object.getPrototypeOf(dog)) // prints -> true

您正在做的只是更改prototypes's`值。它仍然是同一个属性。

<强>修改:

查看instanceof方法

上的简化实施
function instanceOf(object, constructor) {
  return Object.getPrototypeOf(object) === constructor.prototype;
}

如果instanceof的引用等于true,您可以看到Object.getPrototypeOf(object)返回constructor.prototype。在您的情况下,Dog.prototypeCatObject.getPrototypeOf(dog)也为Cat。这就是为什么instanceof将始终返回true的原因。

参考

链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

搜索Object.getPrototypeOf(o) === C.prototype