2015-12-21 63 views
1

看看代碼下面。我會除了輸出將是123-admin 0-null。但相反,它的123管理員0管理員。你能解釋一下爲什麼新的關鍵字不能取代整個用戶對象嗎?Javascript新的關鍵字不重置所有屬性

function User() 
{ 

} 
User.prototype.id=0; 
User.prototype.role={name:null} 

var user = new User(); 
user.role.name = 'admin'; 
user.id = 123; 
window.document.write(" "+user.id+"-"+user.role.name); 
user = new User(); 
window.document.write(" "+user.id+"-"+user.role.name); 

同樣在的jsfiddle: https://jsfiddle.net/tfgx77au/6/

回答

5

role屬性是基於原型,以便對象與構造函數創建的所有實例之間共享。

如果你想在每一個用戶單獨role對象,你必須初始化在構造函數(或至少某處):

function User() { 
    this.role = { name: null }; 
} 
+0

但id屬性更改爲0後的第二個新而角色沒有改變。有什麼區別? –

+0

@NatanRubinstein區別在於「id」屬性是*直接*每個'User'實例的屬性。您設置的「名稱」屬性不是 - 它是(共享)「角色」屬性的屬性。 「角色」在原型對象上,因此被所有實例共享。 – Pointy

+1

@NatanRubinstein當你做一個對象屬性賦值時,比如'user.id = 123;'* always *直接將屬性放在對象上,即使原型上已經有一個類似命名的屬性。換句話說,你不能通過實例直接分配給原型屬性*。但是,您可以*爲原型上的共享對象的屬性賦值。這是最後一個''。 – Pointy