Array作为Object属性原型对象

时间:2014-09-25 23:33:55

标签: javascript arrays object prototype

我创建了一个对象,我后来尝试将其用作原型。 对象的一个​​属性是数组。 我使用它作为原型创建了两个对象,并将一些元素推入第一个对象的数组中,为什么它们会出现在第二个对象的数组中,我该如何修复它,谢谢。

请参阅代码:

var Category = {

          name: "",
         items: [],
    totalSpent: function(){
      var total = 0;
      this.items.forEach(function(item){
        sum += item.price;
      });
    }

  };

var cat1 = Object.create(Category);
var cat2 = Object.create(Category);

cat1.items.push("item1");

console.log(cat2.items);      //return ["item1"]

2 个答案:

答案 0 :(得分:1)

Object.create不会制作该对象的深层副本。它将返回一个基于第二个参数的对象(如果没有给出第二个参数,则为空对象),第一个参数为原型。如果你随后变异该原型的成员,它将影响使用该对象作为原型的所有实例(在你的案例类别中)。

cat1和cat2都是Category,因为它是原型;这样:

cat1.__proto__ === cat2.__proto__;//true
Category === cat1.__proto__;

为了向您展示一个示例,而不涉及原型(请注意:不要使用proto,它是非标准属性):

var org = {member:22};
// copy is a reference to org
// same as cat1={};cat1.__proto__ = Category
// or cat1 = Object.create(Category)
var copy = org;
// same as cat1.items.push('item');
// you are mutating Category.items so mutating Category
copy.member=0;//mutating copy, so mutating org as well
console.log(org.member);//=0

随着原型涉及的事情变得有点复杂,因为重新分配成员实际上会影响该成员而不是更改原型,但上面的例子是为了简单。

var proto = {member:22,other:{sub:22}};
var copy = Object.create(proto);
//this does not affect proto as it will shadow the member
copy.member=0;
//this will affect proto because you're mutating proto.other
copy.other.sub=0;

在您的情况下,items成员是特定于实例的,不应在原型上定义。要初始化特定于实例的成员,可以使用构造函数或初始化实例的init函数,然后再使用它。

这是如何使用原型,阴影等更多解释here

答案 1 :(得分:-1)

你能试试吗

var cat1 = new Category();
var cat2 = new Category();

而不是Object.create()来实例化那些对象?

在这里看到更深入的解释: http://www.htmlgoodies.com/beyond/javascript/object.create-the-new-way-to-create-objects-in-javascript.html