2015-03-08 49 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

相關問題