Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript新关键字未重置所有属性_Javascript_Oop - Fatal编程技术网

Javascript新关键字未重置所有属性

Javascript新关键字未重置所有属性,javascript,oop,Javascript,Oop,看看下面的代码。除了输出为123 admin 0-null之外,我会这样做。而是123 admin 0-admin。你能解释一下为什么新关键字不能替换整个用户对象吗 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(" "+us

看看下面的代码。除了输出为123 admin 0-null之外,我会这样做。而是123 admin 0-admin。你能解释一下为什么新关键字不能替换整个用户对象吗

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);
同样在JSFIDLE中:

角色属性位于原型上,因此对象在使用构造函数创建的所有实例之间共享

如果希望每个用户上都有一个单独的角色对象,则必须在构造函数中或至少在某个地方初始化该对象:

function User() {
  this.role = { name: null };
}
role属性位于原型上,因此对象在使用构造函数创建的所有实例之间共享

如果希望每个用户上都有一个单独的角色对象,则必须在构造函数中或至少在某个地方初始化该对象:

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

但是id属性在第二次新建后更改为0,而角色未更改。区别是什么?@NatanRubinstein区别在于id属性直接是每个用户实例的属性。您正在设置的name属性不是-它是共享角色属性的属性。角色在prototype对象上,因此由所有实例共享。@NatanRubinstein,当您对对象属性进行赋值时,如user.id=123;这总是将属性直接放在对象上,即使原型上已经有一个同名属性。换句话说,您不能通过实例直接指定给原型属性。但是,可以为原型上共享对象的属性指定值。这是最后一次了。这很重要:但是在角色未更改的情况下,id属性在第二次新建后更改为0。区别是什么?@NatanRubinstein区别在于id属性直接是每个用户实例的属性。您正在设置的name属性不是-它是共享角色属性的属性。角色在prototype对象上,因此由所有实例共享。@NatanRubinstein,当您对对象属性进行赋值时,如user.id=123;这总是将属性直接放在对象上,即使原型上已经有一个同名属性。换句话说,您不能通过实例直接指定给原型属性。但是,可以为原型上共享对象的属性指定值。这是最后一次了。这很重要: