说,
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?与C ++,C#或Java等其他OOP语言类似的东西?
答案 0 :(得分:0)
因为这就是原型的工作原理。
在经典的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