gpt4 book ai didi

javascript - 如何正确使用 Object.setPrototypeOf()

转载 作者:行者123 更新时间:2023-11-29 10:05:09 26 4
gpt4 key购买 nike

因此,我一直在快速了解 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.prototypeDog 只是创建对象的工具,它本身不应成为原型(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com