为什么原型允许多个实例共享变量

why prototype allow multiple instances share variables?

本文关键字:实例 共享变量 许多个 原型 为什么      更新时间:2023-09-26

>说,

function Person(name) {
    this.name = name;
}
Person.prototype.share = [];
Person.prototype.printName = function() {
    alert(this.name);
}
var person1 = new Person('Byron');
var person2 = new Person('Frank');
person1.share.push(1);
person2.share.push(2);
console.log(person2.share); //[1,2]

在上面,共享可以由所有实例使用。我想知道这是否特定于Javascript?其他OOP语言(如C++,C#或Java(有什么类似的吗?

因为这就是原型的工作方式。

在经典的OOP(Java,C#等(中,类只是"模板",继承只是组合要从中创建的实例的"模板"。在原型继承中,实例是其父对象是活动对象的对象。它们不仅共享定义,还共享父项的同一实时实例。

那么它为什么有效呢?这是因为原型查找的工作方式。如果在实例中找不到某些属性,引擎将在父实例中查找该属性。如果仍然不存在,它会在原型链中向上查找,直到到达根对象。如果仍然不存在,引擎可以将其声明为undefined(如果是属性查找(或引发错误(如果调用了方法(。

instance -> parent -> parent -> parent -> Object

这就是JS"继承"的方式。它基本上只是寻找拥有你想要的东西的祖先,并在那个级别上运作。这就是为什么Person实例可以推送到share,因为它们有一个共同的父对象。

person1
        '
         > Person.prototype (which has share[])
        /
person2

为了防止这种共享,可以通过在构造函数中声明一个 share 属性来覆盖它(实例化时,每个实例创建一个属性(。另一种方法是在实例上放置一个share属性。后代属性优先于祖先属性,因为查找从底部开始。

function Person(name) {
    this.name = name;
    this.share = []; // Instances will have share, but not shared anymore
}
// or 
person1.share = []; // Creates a share for person1 only