2012-08-14 83 views
1

我花了一些時間在我認爲是一個錯誤,直到我找到解決方法。對象鏈接審問

但我不明白爲什麼以前的代碼失敗。

請有洞察力嗎?

失敗代碼:

getModule: -> 
    Gmaps4Rails.Google 

createMap : -> 
    new @getModule().Map() 

工作代碼:

constructor: 
    @module = @getModule() 

getModule: -> 
    Gmaps4Rails.Google 

createMap : -> 
    new @module.Map() 

回答

3

的原因是,new anonymous function是不一樣的JavaScript中new Gmaps4Rails.Google()

// Translated JavaScript code (simplified): 

var your_module = { 
    getModule: function() { 
     return Gmaps4Rails.Google; 
    }, 
    createMap: function() { 
     // This is where things go wrong 
     return new this.getModule().Map(); 
    } 
}; 

的問題是,return new this.getModule().Map();轉化爲return new function() { return Gmaps4Rails.Google; } - 這忽略返回值,並使用this(它是從所述匿名函數繼承一個新的對象)。因此,該行基本上轉換爲return {}.Map();由於對象沒有Map方法,因此會出現錯誤。

當您設置@module要到Gmaps4Rails.Google參考,然後當你調用new @module.Map()你實際上是調用new Gmaps4Rails.Google - 它返回具有Map方法的對象 - 於是一切正常。

+0

我會理解,如果我寫了:'new this.getModule.Map()',但事實並非如此。這轉化爲:'返回新函數(){return Gmaps4Rails.Google; }()'我猜 – apneadiving 2012-08-14 19:39:28

+0

@apneadiving - 本質上 - 它更接近於將其翻譯爲'var _temp = function(){return Gmaps4Rails.Google; };返回新的_temp();' – 2012-08-14 19:41:23

+0

因此'這個'繼承'Gmaps4Rails.Google'然後this.Map()'被觸發?聽起來很瘋狂:)(+1在此期間) – apneadiving 2012-08-14 19:48:19