Javascript:覆盖Backbone模型的原型

时间:2015-01-02 12:32:17

标签: javascript backbone.js underscore.js splunk

我想使用underscore.js覆盖Backbone模型的原型。这是我的代码:

_.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视图。

1 个答案:

答案 0 :(得分:3)

评估您的代码段时,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应该为true:

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/