链接审讯的对象

时间:2012-08-14 19:18:00

标签: javascript coffeescript

在我找到解决方法之前,我花了一些时间在我认为是一个bug上。

我仍然无法理解为什么以前的代码失败了。

有什么见解吗?

代码失败:

getModule: ->
  Gmaps4Rails.Google

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

工作代码:

constructor:
  @module = @getModule()

getModule: ->
  Gmaps4Rails.Google

createMap : ->
  new @module.Map()

1 个答案:

答案 0 :(得分: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的对象1}}方法 - 因此一切正常。