我创建了一个对象,稍后我尝试使用它作为原型。对象的一个属性是数组。我使用它作为原型创建两个对象,并将一些元素推入第一个对象的数组中,为什么它们会出现在第二个对象的数组中,以及如何修复它,谢谢。
请参阅代码:
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"]发布于 2014-09-26 01:36:16
Object.create不会对对象进行深度复制。它将根据第二个参数返回一个对象(如果没有给出第二个参数,则返回一个空对象),并将第一个参数作为原型返回。如果您随后对该原型的成员进行了变异,那么它将影响使用该对象作为原型的所有实例(在您的例子中是类别)。
cat1和cat2都有它的原型类别;所以:
cat1.__proto__ === cat2.__proto__;//true
Category === cat1.__proto__;为了向您展示一个不涉及prototype的示例(注意:不要使用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函数在使用之前初始化实例。
这是如何使用原型,阴影和更多解释这里。
发布于 2014-09-25 23:41:42
你能试试吗
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
https://stackoverflow.com/questions/26049804
复制相似问题