在我找到解决方法之前,我花了一些时间在我认为是一个bug上。
我仍然无法理解为什么以前的代码失败了。
有什么见解吗?
代码失败:
getModule: ->
Gmaps4Rails.Google
createMap : ->
new @getModule().Map()
工作代码:
constructor:
@module = @getModule()
getModule: ->
Gmaps4Rails.Google
createMap : ->
new @module.Map()
答案 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}}方法 - 因此一切正常。