首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组作为对象属性原型对象。

数组作为对象属性原型对象。
EN

Stack Overflow用户
提问于 2014-09-25 23:33:55
回答 2查看 119关注 0票数 0

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

请参阅代码:

代码语言:javascript
复制
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"]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-26 01:36:16

Object.create不会对对象进行深度复制。它将根据第二个参数返回一个对象(如果没有给出第二个参数,则返回一个空对象),并将第一个参数作为原型返回。如果您随后对该原型的成员进行了变异,那么它将影响使用该对象作为原型的所有实例(在您的例子中是类别)。

cat1和cat2都有它的原型类别;所以:

代码语言:javascript
复制
cat1.__proto__ === cat2.__proto__;//true
Category === cat1.__proto__;

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

代码语言:javascript
复制
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

在涉及原型的情况下,事情会变得更加复杂,因为重新分配成员实际上会隐藏该成员,而不是更改原型,但是上面的示例是为了简单。

代码语言:javascript
复制
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函数在使用之前初始化实例。

这是如何使用原型,阴影和更多解释这里

票数 1
EN

Stack Overflow用户

发布于 2014-09-25 23:41:42

你能试试吗

代码语言:javascript
复制
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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26049804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档