覆盖Backbone.Model构造函数?

时间:2013-11-21 06:27:22

标签: javascript backbone.js

我试图覆盖Backbone.Model上的构造函数来调整传递给父构造函数的属性。这就是我想要做的事情:

Models.Item = Backbone.Model.extend({
    constructor: function (attributes, options) {
        Backbone.Model.apply(this, this.parse(attributes), options);
    },
    parse: function (attributes) { .... }
)};

我的问题是使用未定义的参数调用父构造函数。

https://github.com/jashkenas/backbone/blob/master/backbone.js#L254

var Model = Backbone.Model = function(attributes, options) {
    var attrs = attributes || {};
    options || (options = {});
    this.cid = _.uniqueId('c');
    this.attributes = {};
    if (options.collection) this.collection = options.collection;
    if (options.parse) attrs = this.parse(attrs, options) || {};
    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
    this.set(attrs, options);
    this.changed = {};
    this.initialize.apply(this, arguments);
};

attributesoptions参数都是未定义的,这意味着模型使用默认参数进行实例化。

现在我可以覆盖initialize方法并取消设置错误属性,将其替换为正确的属性。但这看起来像是一个黑客。

为什么使用未定义的参数调用父构造函数?

我错过了什么?

1 个答案:

答案 0 :(得分:0)

错误与Function. applyFunction. call

的语义有关

apply需要两个参数,一个给定的this值和一组参数。

call期望n + 1个参数,给定的this值和n参数传递给函数。

Backbone.Model.apply(this, this.parse(attributes), options);

应该是:

Backbone.Model.call(this, this.parse(attributes), options);

或者

Backbone.Model.apply(this, [this.parse(attributes), options]);

按原样调用apply函数会导致未定义的变量。