【问题标题】:Defining inheritance chain in JS - why recreate prototype?在 JS 中定义继承链 - 为什么要重新创建原型?
【发布时间】:2020-08-16 15:16:05
【问题描述】:

在阅读https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance 时,我看到我们应该用一个新的原型替换Teacher 的原型,它的原型设置为Person

Teacher.prototype = Object.create(Person.prototype);
Object.defineProperty(Teacher.prototype, 'constructor', { 
    value: Teacher, 
    enumerable: false, // so that it does not appear in 'for in' loop
    writable: true });

我宁愿这样做,这对我来说似乎更合乎逻辑:

Teacher.prototype.__proto__ = Person.prototype

据我了解,它最终得到相同的结果并且构造函数保持正确,我不必替换它。

MDN的做法和我的有什么不同吗?

//编辑 正如@Asutosh 指出的那样,MDN 不鼓励使用__proto__ (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto)。但是,MDN 也说要改用Object.setPrototypeOf。那么,我可以这样做吗:

Object.setPrototypeOf(Teacher, Person.prototype)

而不是原来的

Teacher.prototype = Object.create(Person.prototype);
Object.defineProperty(Teacher.prototype, 'constructor', { 
    value: Teacher, 
    enumerable: false, // so that it does not appear in 'for in' loop
    writable: true });

【问题讨论】:

  • proto 的使用在某种程度上已被弃用。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • @Asutosh 这很有趣,谢谢。那么,这个呢,而不是:Object.setPrototypeOf(Teacher, Person.prototype)
  • 这也是不鼓励的。
  • 啊,再次 :) 好的,我明白了。但是,我仍然很好奇,我提出的设置原型的方法会破坏某些东西吗(让我们完全忘记 MDN 不鼓励这样做)。我正在尝试了解 JS 是如何工作的。
  • 不,它不会破坏任何东西。

标签: javascript oop


【解决方案1】:

我可以只做Object.setPrototypeOf(Teacher, Person.prototype)吗?

不,应该是

Object.setPrototypeOf(Teacher.prototype, Person.prototype);

你能用吗?是的,完全没问题,基本上相当于Object.create + .constructor 的定义。

那么为什么这不是标准方法?主要是因为 Object.create 从 ES5 开始就可用,而 Object.setPrototypeOf 仅在 ES6 中引入,但在 ES6 中我们无论如何都只会使用 class Teacher extends Person

【讨论】:

【解决方案2】:

请记住,在 JavaScript 中,原型不是未来对象(如类)的某种概念——它是具有状态和行为的实际实例。创建一个新实例与其说是继承,不如说是关于特定实例的特定状态。

如果您不为原型创建新实例,您的新对象可能会与其他意外对象实例共享特定原型实例。对该特定实例状态的更改也会立即影响您的对象。

通过将原型设置为对象的新实例,您可以访问正确的继承链,但会使用不与任何其他实现共享的新的、干净的实例。

请参阅this 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2018-05-09
    相关资源
    最近更新 更多