我的代码
有一个小CoffeScript代码被剪切:
Function::trigger = (prop, getter, setter) ->
Object.defineProperty this.prototype
get: getter,
set: setter
JavaScript编译
编译器输出:
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
};
};
我的问题
- 为什么编译器会输出那么奇怪的东西
- 我如何更改我的代码以使编译器输出我想要的东西
谢谢。
您的缩进错误。还要注意,您忘记了this.prototype后面的逗号,这会使CoffeeScript编译器认为您正在尝试以对象为参数执行名为this.prototype的函数。
Function::trigger = (prop, getter, setter) ->
Object.defineProperty this.prototype
get: getter,
set: setter
上面的代码应该是这样的。请注意,我做了一些更改,使其更像"CoffeeScript":)
Function::trigger = (prop, getter, setter) ->
Object.defineProperty @::,
get: getter
set: setter
请记住,CoffeeScript是空白字符。CoffeeScript还删除了您在JavaScript中看到的许多"绒毛"(逗号、括号、大括号等)。正因为如此,格式化代码以符合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函数的末尾添加一条返回语句,例如:
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
});
};