因此,我一直在快速了解 JavaScript 的一些新功能,并且一直在阅读有关 Object.setPrototypeOf() 的内容。我从 MDN 中遇到了这段代码它处理从常规对象继承。但是我对他们在这里如何使用 Object.setPrototypeOf() 感到困惑。我希望他们写
Object.setPrototypeOf(Dog, Animal)
与下面的操作相反。他们为什么这样写?
var Animal = {
speak() {
console.log(this.name + ' makes a noise.');
}
};
class Dog {
constructor(name) {
this.name = name;
}
}
Object.setPrototypeOf(Dog.prototype, Animal);// If you do not do this you will get a TypeError when you invoke speak
var d = new Dog('Mitzie');
d.speak(); // Mitzie makes a noise.
最佳答案
调用 Object.setPrototypeOf
的原因是为了确保 Dog
构造函数创建的任何对象都将在它们的原型(prototype)链。设置构造函数本身的原型(prototype)是错误的(不要与构造函数的 prototype
属性混淆,后者确实用词不当),因为构造函数在 d
的原型(prototype)链。
创建的Dog
对象在其原型(prototype)链中没有Dog
,而是Dog.prototype
。 Dog
只是创建对象的工具,它本身不应成为原型(prototype)链的一部分。
您可以改为在Dog
构造函数中执行此操作:
Object.setPrototypeOf(this, Animal)
这使得原型(prototype)链的长度缩短了一步,但缺点是现在 d instanceof Dog
将不再为真。它只会是一个 Animal
。这是一个遗憾,它解释了为什么最好保留原始的 Dog.prototype
对象,同时将 its 原型(prototype)设置为 Animal
,所以现在 d
既是 Dog
又是 Animal
。
阅读有关此主题的信息 here .我会推广my own answer到那个问答。
关于javascript - 如何正确使用 Object.setPrototypeOf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45042777/