1

回避策が見つかるまで、バグだと思ったものに時間を費やしました。

それでも、前のコードが失敗した理由を理解できません。

洞察をお願いします。

失敗したコード:

getModule: ->
  Gmaps4Rails.Google

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

作業コード:

constructor:
  @module = @getModule()

getModule: ->
  Gmaps4Rails.Google

createMap : ->
  new @module.Map()
4

1 に答える 1

3

その理由は、JavaScriptnew anonymous functionと同じではないからです。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-したがって、すべてが機能します。

于 2012-08-14T19:25:08.117 に答える