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 TheOldModelreturnfalse,所以想覆盖原来的。无论如何,我也遇到了 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

http://jsfiddle.net/nikoshr/bcfhqq18/3/