剪切了一个小的CoffeScript代码:
Function::trigger = (prop, getter, setter) ->
Object.defineProperty this.prototype
get: getter,
set: setter
编译器输出:
Function.prototype.trigger = function(prop, getter, setter) {
Object.defineProperty(this.prototype({
get: getter
}));
return {
set: setter
};
};
但我希望输出为:
Function.prototype.trigger = function(prop, getter, setter) {
Object.defineProperty(this.prototype({
get: getter
set: setter
};
};
感谢。
答案 0 :(得分:4)
你的缩进是错误的。还要注意你在this.prototype之后忘记了逗号,这使得CoffeeScript编译器认为你正在尝试以对象作为参数来执行名为this.prototype的函数。
Function::trigger = (prop, getter, setter) ->
Object.defineProperty this.prototype
get: getter,
set: setter
上面的代码应如下所示。请注意,我做了一些更改,使其更像“CoffeeScript-like”:)
Function::trigger = (prop, getter, setter) ->
Object.defineProperty @::,
get: getter
set: setter
请记住,CoffeeScript具有空白重要性。 CoffeeScript还消除了你在JavaScript中看到的许多“绒毛”(逗号,parens,花括号等)。因此,格式化代码以符合CoffeeScript标准对于编写可编译预期的代码至关重要。如果不这样做,编译器将被迫猜测你想要做什么,而且经常是错误的。
以上示例正确编译为以下JavaScript(基于coffeescript.org)...
Function.prototype.trigger = function(prop, getter, setter) {
return Object.defineProperty(this.prototype, {
get: getter,
set: setter
});
};
请注意,CoffeeScript将自动返回上次执行的表达式(在本例中为对Object.defineProperty的调用)。如果你想避免这种行为(你不应该,但有时你需要),你可以在Function.prototype.trigger函数的末尾添加一个return语句,如下:
Function::trigger = (prop, getter, setter) ->
Object.defineProperty @::,
get: getter
set: setter
return
将编译为......
Function.prototype.trigger = function(prop, getter, setter) {
Object.defineProperty(this.prototype, {
get: getter,
set: setter
});
};