骨干模型是单例的吗?
Are Backbone Models Singletons?
我不是JavaScript专家,所以我可能在这里做错了什么。
我有一个简单的Foo Backbone模型,默认属性栏是一个空数组。我创建了模型的两个实例。我将"a"answers"b"添加到第一个模型中,将"c"answers"d"添加到第二个模型中。当我用console.log()打印出bar的内容时,看起来两个实例是相同的对象。
JsFiddle: http://jsfiddle.net/P7qsz/
代码:var Foo = Backbone.Model.extend({
defaults: {
bars: []
}
});
var foo = new Foo();
foo.get("bars").push("a");
foo.get("bars").push("b");
console.log(foo.get("bars"));
var foo2 = new Foo();
foo2.get("bars").push("c");
foo2.get("bars").push("d");
console.log(foo2.get("bars"));
在控制台中我看到:
["a", "b", "c", "d"]
["a", "b", "c", "d"]
我做错了什么?
在javascript中,数组(和对象)作为引用传递。
在这里,您为每个模型分配了相同的数组引用。
要解决这个问题,你需要每次分配一个新的Array。
Backbone.Model.extend({
initialize: function() {
this.set("bars", []); // Here we set a new array
}
});
它们不是单例。
console.log(foo === foo2) //false
两个实例共享默认对象,并且它有对数组的引用。因此,最终该模型的所有实例都具有相同的数组。
数组和对象永远不应该在默认对象中声明,而应该在构造函数中声明。
var Foo = Backbone.Model.extend({
initialize: function () {
this.set("bars", []);
},
defaults: {
bars: null
}
});
相关文章:
- 和兼容的单例骨干模型
- 有状态单例模块
- 在什么情况下我们需要在javsacript中实现单例类
- 如何将一个单例传递给另一个对象,使该对象的所有实例都引用同一个单实例
- 使用Ext.Ajax.request使ExtJS单例返回对象
- 原始值被称为单例的现象是什么?
- AngularJS 模式单例在服务中未更新视图
- 创建命名空间 Javascript 单例类的对象
- 流星.js单例确认框
- Javascript 单例模式
- 如何将 AMD 模块从单例转换为实例
- 为什么这个javascript单例方法有效
- 扩展现有单例
- JavaScript 对象的单例行为
- ES2015 单例或服务提供商或模块,用于敲除.js组件
- 如何在 chrome 开发者控制台中查看在 DOJO 中创建的单例对象
- 在单例模式中引用变量的根父级
- XHR 上传功能的单例引用不起作用
- 角示波器单例
- 骨干模型是单例的吗?