JavaScript 中的原型数组:跨实例共享
在 JavaScript 中,原型可以在类的实例之间共享行为和数据。然而,当对数组进行原型设计时,会出现一种独特的行为:它们在所有类实例之间共享,而不是私有。
原型设计的工作原理:
对象的原型充当创建新对象的蓝图。原型中定义的属性和方法可由继承它的所有对象访问。这个概念不同于基于类的语言,在基于类的语言中,实例具有单独的属性副本。
在以下示例中,Sandwich 类继承自 Sandwich.prototype 对象:
function Sandwich() { // Uncomment to fix the problem //this.ingredients = []; } Sandwich.prototype = { "ingredients" : [], // ... };
这里,成分属性在原型上定义。这意味着所有实例(例如,cheeseburger、blt 等)都将共享同一个数组。
共享数组:
原型数组的问题是修改一个数组实例的数组会影响所有其他实例。正如问题中提供的示例所示,这可能会导致意外行为。当修改cheeseburger.ingredients或blt.ingredients时,它会更改从Sandwich.prototype继承的相同共享数组。
如何避免共享:
创建私有每个实例的数组,在构造函数中定义属性,而不是原型:
function Sandwich() { this.ingredients = []; }
这里,成分属性被分配给每个新创建的实例,使其与其他实例不同并隔离。
共享数据与实例特定数据:
一般规则是在构造函数中分配特定于实例的数据,并在原型中分配共享数据(例如方法)。这允许在创建对象时实现受控访问和灵活性。
附加说明:
以上是为什么 JavaScript 中的原型数组会在实例之间共享?的详细内容。更多信息请关注PHP中文网其他相关文章!