2

我的代码

有一个小的 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
  };
};

我的问题

  • 为什么编译器会输出那么奇怪的东西?
  • 如何更改我的代码以使编译器输出想要的内容?

谢谢。

4

1 回答 1

4

你的缩进是错误的。还要注意你是如何忘记了 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 是 whitespace-significant。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 函数的末尾添加一个 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
  });
};
于 2012-07-20T19:26:05.037 回答