Javascript:覆盖 Backbone 模型的原型
Javascript: Overwriting the prototype of a Backbone model
我想使用 underscore.js 覆盖 Backbone 模型的原型。这是我的代码:
_.extend(TableView.prototype, {
el: $("#" + this.id + "_div"),
});
总而言之,我希望模型默认附加到一个 html 元素,其 id 等于模型的 id 加上“_div”。模型的 id 是 TableView
的属性 id
,我尝试使用 this
访问模型。问题是我收到错误:"this is undefined"。为什么?
PS:我知道正确的方法是在新模型中扩展模型。因为Backbone的extend()方法好像不像class继承,而my_new_object instanceof TheOldModel
returnfalse
,所以想覆盖原来的。无论如何,我也遇到了 TableView.extend()
相同的错误。
PPS:我正在扩展一些 Splunk 视图。
当您的代码片段被评估时,this
没有特定的含义并且被设置为任何上下文。它只有在稍后发生的实例上下文中才有意义。
如果你想设置一个动态的el
,提供一个在实例化视图时要计算的函数:
var TableView = Backbone.View.extend({
el: function() {
return '#'+this.id+'_div';
}
});
var v = new TableView({id: 'x'});
console.log(v.$el.text());
http://jsfiddle.net/nikoshr/bcfhqq18/
或者,如果您更喜欢修改原型
TableView.prototype.el = function() {
return '#'+this.id+'_div';
}
http://jsfiddle.net/nikoshr/bcfhqq18/2/
最后,请注意,通过 Backbone 扩展 class 会设置原型链,并且 instanceof
在针对祖先 class:[=19= 进行测试时应该为真]
var TableView = Backbone.View.extend({
});
var DeepTableView = TableView.extend({
el: function() {
return '#'+this.id+'_div';
}
});
var v = new DeepTableView({id: 'x'});
console.log(v instanceof Backbone.View); // true
console.log(v instanceof TableView); // true
console.log(v instanceof DeepTableView); // true
我想使用 underscore.js 覆盖 Backbone 模型的原型。这是我的代码:
_.extend(TableView.prototype, {
el: $("#" + this.id + "_div"),
});
总而言之,我希望模型默认附加到一个 html 元素,其 id 等于模型的 id 加上“_div”。模型的 id 是 TableView
的属性 id
,我尝试使用 this
访问模型。问题是我收到错误:"this is undefined"。为什么?
PS:我知道正确的方法是在新模型中扩展模型。因为Backbone的extend()方法好像不像class继承,而my_new_object instanceof TheOldModel
returnfalse
,所以想覆盖原来的。无论如何,我也遇到了 TableView.extend()
相同的错误。
PPS:我正在扩展一些 Splunk 视图。
当您的代码片段被评估时,this
没有特定的含义并且被设置为任何上下文。它只有在稍后发生的实例上下文中才有意义。
如果你想设置一个动态的el
,提供一个在实例化视图时要计算的函数:
var TableView = Backbone.View.extend({
el: function() {
return '#'+this.id+'_div';
}
});
var v = new TableView({id: 'x'});
console.log(v.$el.text());
http://jsfiddle.net/nikoshr/bcfhqq18/
或者,如果您更喜欢修改原型
TableView.prototype.el = function() {
return '#'+this.id+'_div';
}
http://jsfiddle.net/nikoshr/bcfhqq18/2/
最后,请注意,通过 Backbone 扩展 class 会设置原型链,并且 instanceof
在针对祖先 class:[=19= 进行测试时应该为真]
var TableView = Backbone.View.extend({
});
var DeepTableView = TableView.extend({
el: function() {
return '#'+this.id+'_div';
}
});
var v = new DeepTableView({id: 'x'});
console.log(v instanceof Backbone.View); // true
console.log(v instanceof TableView); // true
console.log(v instanceof DeepTableView); // true