admin.attributes.isAdmin被分配了值。而guest.attributes.isAdmin没有分配任何东西。请让我明白

时间:2018-10-08 08:31:02

标签: javascript

我正试图理解这段代码:

var User = function() {};

User.prototype.attributes = {
  isAdmin: false
};

var admin = new User("Sam"),
  guest = new User("Bob");

admin.attributes.isAdmin = true;

alert(admin.attributes.isAdmin);
alert(guest.attributes.isAdmin);

其输出为真(两次)

请帮助我理解这个概念。任何帮助都表示赞赏。 谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用attributes的副本,因为通过寻址attributes,您将覆盖所有实例的值。

var User = function() {
        this.attributes = Object.assign({}, this.attributes);
    };

User.prototype.attributes = { isAdmin: false };

var admin = new User("Sam"), 
    guest = new User("Bob");

admin.attributes.isAdmin = true;

console.log(admin.attributes.isAdmin); 
console.log(guest.attributes.isAdmin);

JavaScript接受一个属性,并查看它是否退出。如果不存在,则在原型链中查找该属性是否存在。如果存在,则使用此值。

分配值也一样。

要获得更详细的视图,您可以访问Inheritance and the prototype chain

答案 1 :(得分:0)

在JS对象中通过引用传递。在您的示例中,adminguest存储对同一对象attributes的引用。您可以克隆对象(创建其值的副本)或将isAdmin属性存储在prototype中。