我创建了一个对象,我后来尝试将其用作原型。 对象的一个属性是数组。 我使用它作为原型创建了两个对象,并将一些元素推入第一个对象的数组中,为什么它们会出现在第二个对象的数组中,我该如何修复它,谢谢。
请参阅代码:
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"]
答案 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