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

标签 javascript ecmascript-6

因此,我一直在快速了解 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/

相关文章:

javascript - Plotly.js 图表中显示的数据错误

javascript - 来自变量的 jQuery 选择器

javascript - 你如何计算粒子相互弹跳的速度?

javascript - 使用带有 babel 转译器的 es6 模块导入类并调用静态方法

javascript - 检测 ES2015 代码是由 babel 转译的还是本地运行的?

javascript - 通过javascript动态添加css到页面

javascript - 如何使用 jQuery 使对象在视口(viewport)中水平居中?

多行字符串的 JSON 和模板文字

node.js - 当我尝试将我的 Angular 应用程序部署到 heroku 时,在 multi ./src/styles.scss 中出现错误

javascript - es6 中用于确定调用函数的 arguments.callee 替代方案