[英]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.