2011-06-28 25 views
8

我有我想從我的Backbone.Model對象的實例訪問靜態屬性。我知道我可以硬編碼父構造函數來調用該方法,但這阻止了我具有多態靜態函數。例如,如果需要,我希望能夠覆蓋ExtendedInventory中的foo函數,而不必更改任何其他代碼。如何在不指定模型名稱的情況下從該模型的實例調用靜態Backbone.Model函數?

var Inventory = Backbone.Model.extend({}, 
    //STATIC 
    { 
     foo: function() { 
      alert('bar'); 
     } 
    }); 

var i = new Inventory({}); 
i.constructor.foo(); //This works! 

var ExtendedInventory = Inventory.extend({}); 

var ei = new ExtendedInventory({}); 
ei.constructor.foo(); //THIS DOES NOT WORK 


//How do I generically access the `Inventory.foo()` function via the `ei` object. I would 
+0

所以,這個工作,但我不明白它非常好,它只能在Firefox工作:ei.constructor.prototype .__ proto __。constructor.foo() –

+1

我寫了一篇博客文章,介紹了使用靜態成員和骨幹的例子,這可能對任何遇到此問題的人都有幫助。 http://taurenmills.wordpress.com/2011/10/08/backbone-js-with-class-properties/ – Tauren

+0

+1用於吸引關注類屬性 – Chuck

回答

2

在你的例子中什麼不能正確工作?在Firefox和IE瀏覽器中,我都會看到兩個帶有「欄」的彈出窗口,看起來像預期的結果?它的靜態部分似乎也表現良好,請參閱this jsfiddle

(這是與骨幹的HEAD版本,順便說一句,不知道是否有差別)

+0

謝謝!我正在撞牆,但升級到更新的版本使它按我的希望工作。它不適用於主骨幹站點的0.3.3下載(錯誤是:ei.constructor.foo不是函數)。我只是希望我明白他們爲什麼會有不同的表現,所以我會做一些比較,看看我能否弄清楚。 –

4

嗯。雖然上面的代碼確實有效,但我不會這麼說。如果函數通過類的對象在邏輯上可訪問,那麼在調用類/「靜態」函數的基類中定義一個實例方法。這使得代碼更清潔,更清晰,我認爲(加,客戶不必記住有些晦澀難懂的語法):

var Inventory = Backbone.Model.extend({ 
    foo: function() { 
     this.constructor.foo(); 
    } 
}, { 
    foo: function() { 
     alert('bar'); 
    } 
}); 

var i = new Inventory({}); 
i.foo(); //This works! 

var ExtendedInventory = Inventory.extend({}); 

var ei = new ExtendedInventory({}); 
ei.foo(); 
+1

我喜歡這個建議......謝謝! –

+0

+1使用第二個參數來註冊靜態函數,即使你沒有在你的例子中使用它static:D Inventory.foo()工作正常,謝謝;) – MaBi

相關問題