繁体   English   中英

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

[英]why prototype allow multiple instances share variables?

说,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM