2015-03-08 71 views
1

我有一个例子,下面创建两个父模型,然后使用自定义函数将子模型推送到父数组中。为什么将儿童模型添加到父级模型?

JS滨:http://jsbin.com/hamuro/4/edit?html,console

var Child = Backbone.Model.extend({}); 

var Parent = Backbone.Model.extend({ 
    defaults: { 
     children: [] 
    }, 
    addChild: function() { 
     var child = new Child(); 
     this.get('children').push(child); 
     return child; 
    } 
    }); 

    var parent1 = new Parent(); 
    var parent2 = new Parent(); 

    parent2.addChild(); 
    parent2.addChild(); 

    console.log('Parent 1 Total Children: ' + parent1.get('children').length); 
    console.log('Parent 2 Total Children: ' + parent2.get('children').length); 

预期输出:

“父1总的儿童:0”

“父2共儿童:2”

实际输出:

“父1总小孩:2”

“父2总小孩:2”

问:

为什么孩子被推到即使我只指定了父模型孩子被推到父母2?

回答

5

因为它们共享一个children阵列:当默认设置,它们是由分配集合,哪些被分配是对数组的引用,而不是复制阵列的。例如,对于同样的原因,ab下方指向同一个数组:

var a = []; 
var b = a; 

...通过defaults机制只是宁可少直接。

相反,你指定一个defaults功能,它获取每次创建一个不同的阵列称为:

defaults功能:

var Parent = Backbone.Model.extend({ 
    defaults: function() [ 
    return { 
     children: [] 
    }; 
    }, 
    addChild: function() { 
    var child = new Child(); 
    this.get('children').push(child); 
    return child; 
    } 
}); 

这是the documentation谈论时说:

请记住,在JavaScript中,对象是通过引用传递的,所以如果包含一个对象作为默认值,它将在所有实例之间共享。相反,将defaults定义为函数。

它也有可能这个使用constructor而不是做的,但我不会让一个例子,因为我不使用骨干,并可以很容易地展示一些东西误导(和文档指向使用defaults功能,所以他们可能有一个原因)。

+1

感谢您的明确解释。我甚至没有考虑过这个问题与设置默认值的方式有关。 – Josh 2015-03-08 18:38:24