簡體   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