【问题标题】:Why is new Parent() often used to initialize prototypes of children instead of Object.create(Parent.prototype)?为什么用 new Parent() 来初始化孩子的原型,而不是 Object.create(Parent.prototype)?
【发布时间】:2016-10-07 07:38:19
【问题描述】:

Mozilla documentation page 的中间它切换(没有足够清楚的解释)示例来自

WorkerBee.prototype = Object.create(Employee.prototype);

WorkerBee.prototype = new Employee;

第二种形式new Employee 将使用应该只存在于WorkBee 实例中的属性来初始化WorkBee 的原型。

为什么在这么多 JavaScript 继承示例中使用第二种形式? 给继承的属性和自己的属性赋予不同的状态不是不希望的吗?

WorkBee 中的 Employee 属性名称的状态与属性项目不同,因为名称是在 WorkBee.prototype.name 中定义的,而项目是在 WorkBee 实例中定义的。

一般来说,为什么有人会想要使用非抽象类 X 的构造函数来初始化 JavaScript 中派生类 Y 的原型?

在我看来,这两个构造函数都应该只用于初始化 X 和 Y 的实例,如果 Y 是从 X 派生的,那么构造函数 X 应该初始化 Y 的实例,而不是 Y 的原型。 但是如果 X 是抽象的,这意味着我们不希望有 X 的实例,那么只有这样我们才有可能使用 X 构造函数作为放置派生类原型初始化的地方。

【问题讨论】:

  • 链接的文章其实has more problems不止于此
  • 这篇文章说“它是 2015 年:那不应该是 MDN 的一部分。”,我只能补充它是 2016 年 10 月:那不应该是 MDN 的一部分。
  • 这是一个 wiki - 请帮助 :-)

标签: javascript inheritance prototype instance new-operator


【解决方案1】:

为什么在这么多 JavaScript 继承示例中使用第二种形式?

因为我们没有摆脱它,它还在不断蔓延。另请参阅 here 了解一些历史记录。

给继承的属性和自己的属性赋予不同的状态难道不是不受欢迎的吗?

是的,绝对的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多