Javascript:覆盖骨干模型的原型

Javascript: Overwriting the prototype of a Backbone model

本文关键字:模型 原型 覆盖 Javascript      更新时间:2023-09-26

我想使用下划线覆盖骨干模型的原型.js。这是我的代码:

_.extend(TableView.prototype, {
    el: $("#" + this.id + "_div"),
});

总之,我希望默认情况下模型附加到一个 html 元素,其 id 等于模型的 id 加上"_div"。模型的id是TableView的属性id,我尝试使用this访问模型。问题是我收到错误:"这是未定义的"。为什么?

PS:我知道正确的方法是在新模型中扩展模型。我想覆盖原来的,因为 Backbone 的 extend() 方法似乎不像类继承,my_new_object instanceof TheOldModel返回false。无论如何,我也遇到了同样的错误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 扩展类会设置原型链,并且在针对祖先类进行测试时instanceof应该为真:

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/