2013-11-21 80 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功能,因爲我是導致未定義的變量。