2013-01-04 64 views
2

我正在使用CoffeeScript中的Backbone.js進行編程,並且存在與lodash和合並函數有關的繼承問題。由於lodash合併函數,CoffesScript中的繼承無法正常工作

有一個超從中

class SubView extends NavigationView 

    initialize: -> 
     # Setting the view's template property using the Underscore template method 
    _.merge @config, { 
     test: 
      string: "bla" 
     } 

class IndexView extends NavigationView 
... 

衍生

class NavigationView extends Backbone.View 
    config: 
    test: 
     string: "Test" 

和兩類如果我子視圖的功能內改變初始化配置變量它也是在IndexView的實例變化。

我實例化我的對象,像這樣,一個BackBone.Router類中:

index:() -> 
    # Instantiates a new view which will render the header text to the page 
    new IndexView() 

    sub:() -> 
    new SubView() 

我創建了一個小提琴來顯示它:http://jsfiddle.net/hijolan/9VeND/

任何想法如何做到這一點?

最好的問候,hijolan

+0

你有別的事情上,你沒有向我們展示。你的代碼與[這個例子](http://jsfiddle.net/ambiguous/vRqGY/)有什麼不同?並且您可能想要檢查最後一個代碼塊中的縮進,正確的縮進在CoffeeScript中非常重要。 –

+0

嘿!你是絕對正確的...我用lodash中的_.merge函數(如underscore.js)來合併我的初始化函數中的配置,以便將父配置文件和派生類中的配置文件合併。整個配置不合並(僅用於測試目的)它正常工作!感謝您的幫助... –

+0

以下小提琴顯示問題:http://jsfiddle.net/hijolan/9VeND/ –

回答

4

您的問題是_.merge修改就地第一個參數:

_.merge(object [, source1, source2, …])

融合了源對象(S)的枚舉的屬性到destination對象。

請注意,如果文檔中說明的是destination,那麼它的真正含義是object。的merge的意圖是成爲_.extend了深刻的版本和下劃線文檔是明確會發生什麼:

延長_.extend(destination, *sources)

全部複製在源屬性對象轉移到目的地對象,並返回目的地對象。

你會發現,lodash的extend (AKA assign)也得到混合參數名:

_.assign(object [, source1, source2, …])

分配自己的destination對象source對象(S)的枚舉的屬性。

當他們說destination時他們再次意味着object

當你這樣做:

class NavigationView extends Backbone.View 
    config: 
    test: 
     string: "Test" 

config最終連接到原型NavigationView等完全相同的config對象將通過NavigationView及其子類中可以看出。這意味着,@config爲原型的configinitialize

_.merge @config, { test: { string1: "blub" } } 

所以_.merge將新值合併右轉入原型的config這使得可見一路攀升至NavigationView並分解成其所有子類的變化。如果您跟蹤繼承回來了,你會發現,@config在這方面是從NavigationView所以你_.merge是寫作的只是一個棘手和混亂的方式:

_.merge NavigationView::config, ... 

問題的根源在於_.extend_.merge修改第一個參數。走出這個陷阱的辦法是提供一個目標對象,它是安全的可寫:

@config = _.merge { }, @config, { test: { string1: 'blub' } } 
# ----------------^^^ 

演示:http://jsfiddle.net/ambiguous/7j2FM/

+0

嘿!非常感謝!一方面是(簡單的)解決方案,另一方面是爲了完美和深刻的解釋)解釋!!!!!!! –

+3

如果我無法解釋它,那麼我不明白它,如果我不明白它,那麼我不能回答它:)我不明白爲什麼每個人的'extend'都以這種方式行事(即使jQuery的['' $ .extend'](http://api.jquery.com/jQuery.extend/)),它似乎很容易出錯,「容易出錯」不應該是默認行爲。我想借口就是表演。 –