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