2013-11-21 41 views
0

我想重写我的Backbone.Model上的构造函数来调整传递给父构造函数的属性。这是我想要做的:重写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方法并取消设置不良属性,并将其替换为正确的属性。但是,这看起来像一个黑客。

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

我错过了什么?

+0

你为什么要发布一个你已经知道答案的问题?如果你发布一个问题,至少应该给予他人一个回答它的机会。 – Bart

+0

因为我在问这个问题的时候想出了它,并且想写下来。随意提供你自己的答案。 – Martinffx

回答

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功能,因为我是导致未定义的变量。