2012-08-14 79 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