Javascript 主干删除和新建视图不会重置其属性数组内容

Javascript 主干删除和新建视图不会重置其属性数组内容,javascript,arrays,backbone.js,javascript-objects,backbone-views,Javascript,Arrays,Backbone.js,Javascript Objects,Backbone Views,我对主干网有以下两个属性的看法: var MyBasketView = Backbone.View.extend({ _totalCost: 0, _devices: [], 在初始化时,我在localStorage中通过一个包含多个设备的数组,将它们推送到_devices数组中,并将它们的总成本加起来,如下所示 var self = this; _.each(this._cartItems, function(cartItem) { self._totalCost

我对主干网有以下两个属性的看法:

var MyBasketView = Backbone.View.extend({

    _totalCost: 0,
    _devices:  [],
在初始化时,我在localStorage中通过一个包含多个设备的数组,将它们推送到_devices数组中,并将它们的总成本加起来,如下所示

var self = this;
_.each(this._cartItems, function(cartItem) {
    self._totalCost += cartItem.item.cost;
    self._devices.push(cartItem.item);
}
在我的路由器中,当我离开这个页面时,我会删除这个视图,当我回来时,我会再次创建这个视图。问题是,当我在initialize函数中打印属性时,总成本为0,并且设备数组仍然具有以前的设备

当我删除视图或使用新的MyBasketView()创建视图时,是否应该重置它


我当然可以在初始化中清除它,但我想了解为什么会发生这种情况,以及其他对象是否也会发生这种情况?

解释与(精细打印)基本相同:

记住,在JavaScript中,对象是通过引用传递的,所以如果 如果包含一个对象作为默认值,它将在所有用户之间共享 实例

创建视图的新实例时,会复制值,包括将指向同一数组引用的
\u设备

var v1 = new MyBasketView();
var v2 = new MyBasketView();

v1._devices === v2._devices // true

该数组的内容在
MyBasketView
原型的整个生命周期内都会保留(即使实例被销毁)

最简单的修复方法是在
initialize
函数中指定变量:

var MyBasketView = Backbone.View.extend({
    _totalCost: 0,
    initialize: function() {
        this._devices = [];
    }
});

主干网似乎就是这样工作的。您传递的对象不是深度克隆对象。在
initialize
中设置非常量变量可能是更好的做法


请参阅:

感谢您的快速回复。在模型文档中没有注意到这一点,因为我正在查看视图文档。这是有道理的,但这不是我在创建新对象时所期望的。