为什么javascript在实例

时间:2016-06-10 16:31:33

标签: javascript inheritance dojo

道歉,如果这个问题看起来很愚蠢,但我对JS来说相对较新。

我有一个继承Animal的类Dog。 Animal有一个数组属性。 在代码中我创建了一个新的Dog并向数组中添加了东西。 问题是Dog的每个新实例似乎都共享该数组。

Animal.js:



define([
  "dojo/_base/declare",
  "evo/common/model/_Model"
  ], function(declare, _Model ) {
  return declare([_Model], {
    _id: 0,
    _items: [],
    _filter: null,
    
    ...
    
  });
});




Dog.js:



define([
  "dojo/_base/declare",
  "evo/common/model/_ModelList"
], function (declare, _ModelList) {
  return declare([_ModelList], {
    
    ...
    
  });
});




我在创建新狗时修复了重置_items,但我怀疑如果我有多个Dog实例,这会影响所有。 如何使属性非静态?

1 个答案:

答案 0 :(得分:3)

创建dojo类时,如果它包含数组或其他对象,则应在constructor()中声明它们,这样每个实例都会按预期获得自己的副本。

请注意,在JS简单类型中,如字符串,数字,布尔值,null都是按值分配的,并且可以在dojo类中声明。

相反,对象是通过引用分配的,包括数组(在JS中被视为“特殊”对象)。

示例:

https://jsfiddle.net/ua3gytbu/

require(["dojo/_base/declare"], function(declare) {
  var Animal = declare(null, {
    constructor: function() {}
  });
  var Dog = declare(Animal, {
    constructor: function() {
         this.items = [];   
    }
  });

  var dog = new Dog();
  dog.items.push(1);
  dog.items.push(2);

  var dog2 = new Dog();
  dog2.items.push(3);

  alert('dog has in items ' + dog.items.length);
  alert('dog2 has in items ' + dog2.items.length);
});
相关问题