事实证明,在创建类实例时,我忽略了使用new
关键字。问题本身的代码很好。
我有一个相当简单的类,构造函数在类上调用另一个方法(editor_for_node)。调用发生在jQuery each()循环中,但我也尝试将其移到外面。
define ['jquery'], ($) ->
class Editor
constructor: (@node, @data, @template) ->
@node.widgets().each (i, elem) =>
data = if @data then @data[i] else null
node = $(elem)
@editor_for_node node, data
editor_for_node: (node, data) ->
console.log 'hello!'
return {
'Editor': Editor,
}
当调用@editor_for_node node, data
行时,我收到错误(在Firebug中)this.editor_for_node is not a function
。
我真的不明白为什么这不能正常工作,我能看到的唯一可能的奇怪来源是我在开始时使用require.js的define函数。
(function() {
define(['jquery'], function($) {
var Editor;
Editor = (function() {
Editor.name = 'Editor';
function Editor(node, data, template) {
var _this = this;
this.node = node;
this.data = data;
this.template = template;
this.node.widgets().each(function(i, elem) {
data = _this.data ? _this.data[i] : null;
node = $(elem);
return _this.editor_for_node(node, data);
});
}
Editor.prototype.editor_for_node = function(node, data) {
return console.log('hello!');
};
return Editor;
})();
return {
'Editor': Editor
};
});
}).call(this);
答案 0 :(得分:4)
首先:您使用的是哪个版本的CoffeeScript?在某些先前版本中,胖箭头一直是错误的来源。
如果您使用的是最新版本(1.3.1),那么我将继续说这是一个缩进问题。当我复制并粘贴您的代码时,它工作正常。你在混合标签和空格吗?验证编译的输出是否包含行
Editor.prototype.editor_for_node = ...
更新:查看有关此答案的评论。结果证明问题是在调用构造函数时没有使用new
关键字。