骨干视图继承共享属性
Backbone View inheritance sharing properties
我正在扩展Backbone视图,如:
var baseView = Backbone.View.extend({
fruits : [],
listFruits : function() {
console.log(this.fruits);
}
});
var firstView = baseView.extend({
initialize : function() {
this.fruits.push("apple");
}
});
var secondView = baseView.extend({
initialize : function() {
this.fruits.push("pear");
}
});
var firstViewInstance = new firstView(); // ["apple", "pear"]
var secondViewInstance = new secondView(); // ["apple", "pear"]
firstViewInstance.listFruits();
secondViewInstance.listFruits();
在我看来,firstViewInstance
和secondViewInstance
应该完全分开,但它们显然是相关的。我如何实现两个独立的视图对象,都继承自一个共同的基础,但不共享数据?
编辑:根据下面的答案,我有一个更新的小提琴http://jsfiddle.net/qZ7SU/似乎解决了这个问题。我仍然不完全清楚发生了什么,但我认为明确地将fruits[]
附加到this
,将其创建为实例变量,而不是将其附加到原型。
这是因为对原始fruits
-属性的引用是复制到子视图的引用。参见underscore.js extend
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
obj[prop] = source[prop];
}
}
});
return obj;
};
要从公共基数据继承,但不共享数据,需要在initialize-function中初始化非共享属性。
var baseView = Backbone.View.extend({
initialize: function() {
this._initializeBase();
},
_initializeBase: function() {
this.fruits = [];
},
listFruits : function() {
console.log(this.fruits);
}
});
var firstView = baseView.extend({
initialize : function() {
this._initializeBase();
this.fruits.push("apple");
}
});
这样,该属性将在对象初始化时添加到对象中,并且数据不会被共享。
希望这对你有帮助!
我对此写了一篇更详细的博客文章,但最简单的方法是提供一个自定义构造函数,以确保fruits
是在每个子视图的原型上创建的,而不是在所有子视图继承的baseView.prototype
上。
var baseView = Backbone.View.extend({
constructor: function() {
this.fruits = [];
Backbone.View.apply(this, arguments);
},
listFruits : function() {
console.log(this.fruits);
}
});
var firstView = baseView.extend({
initialize : function() {
this.fruits.push("apple");
}
});
var secondView = baseView.extend({
initialize : function() {
this.fruits.push("pear");
}
});
var firstViewInstance = new firstView(); // ["apple"]
var secondViewInstance = new secondView(); // ["pear"]
相关文章:
- 如何创建共享某些属性的对象
- React组件之间共享属性
- 与所有派生子项共享父属性值
- 为什么 PrototypeJS 类实例共享相同的属性
- 如果对象使用 reduce、forEach 或筛选器共享属性值,则合并 JSON 数组中的对象
- Javascript 类属性表现为共享变量
- 在 Javascript 中的对象组之间共享属性
- 共享javascript属性
- 如何将父指令的属性与子指令共享
- 为什么基类的对象属性与子类的所有实例共享?
- 在共享扩展访问网页属性
- 跨实例共享的Javascript对象属性
- 在AngularJS中,如何为多个控制器的共享服务属性的异步模型更改更新绑定[.]
- 如何使用javascript原型在实例之间共享属性
- 如何从一个共享属性的jQuery集合中获取一个属性数组
- 骨干视图继承共享属性
- JavaScript 原型共享属性
- 替换javascript对象的共享属性
- 如何在AngularJS中创建一个具有控制器间可共享属性的对象
- 我可以在java和javascript之间共享属性文件吗?