2015-12-21 61 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