覆盖原型继承中的数组

Override an array in prototypal inheritance

本文关键字:数组 继承 原型 覆盖      更新时间:2023-09-26

我正在研究一个需要继承的功能,如下所示:

function parent() {}
parent.prototype.someProperty = ['common'];
var child1 = new parent();

我想覆盖一些属性。如果这是一个原始数据类型,这很容易,但someProperty是一个数组。在这里,child1 在someProperty中还有其他一些值,例如 ['common', 'common2', 'common3']

现在这是一个数组,所以如果我推送像child1.someProperty.push('common2');这样的元素,它们也会通过引用进入parent

实现这一目标的最佳方法是什么?

我想到的事情

  • 从原型中复制阵列,然后将其附加到child1 。问题出在这里,我将不得不运行整个数组,然后复制它。我想知道是否有更优雅的解决方案。
  • 有类似function parent() { someProperty = ['common'];}的东西.这将为所有子对象提供someProperty,因此可以轻松地将任何值推入其中,而不会干扰其他子对象。

我倾向于第二种方法,但我只是想确定是否有更好的方法。

如果你的属性会随着实例而改变,那么它们最好存在于实例本身上,而不是原型上。 如果您有需要由某个类的所有实例共享的数据,则有两种选择。

1)像你一直在做的那样在原型上拍打属性。这对于函数非常有效,但我几乎从不将数据/非函数引用放在原型上。这部分是为了风格,部分是为了一致性。

2)将属性"静态"附加到构造函数,并像Circle.PI而不是cirlceInstance.PI一样访问它

在您的情况下,此数组似乎应该是一个实例属性。

var Thing1 = function() { this.property = []; }