0

我在使用 Backbone.Model 时遇到了一个奇怪的错误

所以我有类似的模型声明:

var MyMode = Backbone.Model.extend({
   defaults:{
      'someList': []
   },

   initialize: function(){
      _.bindAll(this, 'toString', 'castFromString');
   },

   toString: function(){
      return this.get('hierarchyNameList').join('+');
   },

   castFromString: function(str){
      var strArray = [], index = 0;
      if (str) {
         strArray = str.split('+');
      }
      for (index = 0; index < strArray.length; index++){
         this.get('hierarchyNameList').push(strArray[index]);
      }
   }
});

然后我尝试测试它

(function () {
'use strict';

var assert = function(condition, message) {
    if (condition !== true) {
        throw message || "Assertion failed";
    }
};

var mA = new MyModel({'someList': ['a','b','c']});
var mB = new MyModel();
mB.castFromString('a+b+c');

//I have a added a equals function to array prototype and tested it
assert(mA.get('someList').equals(mB.get('someList')));     //true

var mC = new MyModel(mA.toJSON());    //behaves as expected
var mD = new MyModel();   //for some reason its list already contains the list from B
mD.castFromString(mB.toString());    //since castFromString used push, now B and D both has array of length 6

assert(mC.equals(mA));    //success
assert(mC.equals(mD));    //fail, mc has arrayLength 3, mD has 6


 }).call(this);

实际的代码比这更复杂,但我认为这可能是我做错了什么,关于为什么会发生这种情况的任何建议?提前致谢!

4

1 回答 1

3

问题在于您的默认值

defaults:{
  'someList': []
},

JavaScript 中的对象是通过引用而不是值传递的。这意味着您没有明确指定值的所有实例都将共享上面定义someList中创建的数组。defaults为避免这种情况,您可以将您的定义defaults为一个函数:

defaults: function () {
    return { 'someList': [] };
},

这将为 的每个实例创建新数组MyModel,因此它们不会共享相同的数组。

于 2013-10-06T21:14:01.213 回答