首页 > web前端 > js教程 > 正文

为什么 JavaScript 中的原型数组会在实例之间共享?

Linda Hamilton
发布: 2024-11-23 02:19:10
原创
230 人浏览过

Why Do Prototyped Arrays in JavaScript Become Shared Across Instances?

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 = [];
}
登录后复制

这里,成分属性被分配给每个新创建的实例,使其与其他实例不同并隔离。

共享数据与实例特定数据:

一般规则是在构造函数中分配特定于实例的数据,并在原型中分配共享数据(例如方法)。这允许在创建对象时实现受控访问和灵活性。

附加说明:

  • 原型属性通过指向原型对象的指针在内部引用。
  • 可以使用以下方式访问对象的原型Object.getPrototypeOf(obj).
  • 此行为是 JavaScript 中原型继承所固有的,不适用于基于类的语言。

以上是为什么 JavaScript 中的原型数组会在实例之间共享?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板