我有以下两个功能:
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
?
答案 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.prototype
为Cat
,Object.getPrototypeOf(dog)
也为Cat
。这就是为什么instanceof
将始终返回true的原因。
参考
链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
搜索Object.getPrototypeOf(o) === C.prototype