【问题标题】:JavaScript inheritance: why copy from an instance?JavaScript 继承:为什么要从实例中复制?
【发布时间】:2016-04-20 14:27:57
【问题描述】:

在 JavaScript 中,当我想从“类”继承属性时,我会这样写:

Car.prototype = new Vehicle();

为什么我要在这里分配一个车辆实例?

我们为什么不写Car.prototype = Vehicle; 或Car.prototype = Vehicle.prototype; 呢?为什么要从实例复制?

【问题讨论】:

  • 为什么要从实例复制? - 请注意Car.prototype = new Vehicle()不复制实例。它为Car.prototype 分配实例的reference。没有复制。

标签: javascript inheritance prototype


【解决方案1】:

首先,你真的应该这样做

Car.prototype = Object.create(Vehicle.prototype);

其中有原因,但我只想说这是为您的 Car 原型获取新对象并确保它继承自 Vehicle 原型的更好方法。

现在,您想要为Car 原型创建一个新对象的原因是,如果您想创建一个子类,您可能需要专门的行为确实适用于子类,但不适用于更一般的父类。这些新属性需要一个新对象;否则,您会将这些行为属性添加到 Vehicle 原型中,并且所有车辆都可以访问。

最后,将Car.prototype 设置为Vehicle 没有多大意义。这会工作,因为它不会导致异常,但会将Car 原型设置为Vehicle 构造函数本身。

【讨论】:

  • T. J. Crowder 有一个很好的答案漂浮在某个地方,详细介绍了创建原型对象以进行继承。
【解决方案2】:

基本上 .prototype 是一个对象。并通过直接分配

Car.prototype = Vehicle.prototype

您正在通过引用复制对象。

如果您尝试修改 Car.prototype 以添加新功能,例如发出 bip 声音,您也将修改 Vehicle.prototype,因为它们都引用同一个对象。

这可能不是你想要的。

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 2018-02-14
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2010-12-07
    相关资源
    最近更新 更多