CoffeeScript:使用对象作为参数

时间:2012-07-20 19:24:02

标签: javascript coffeescript

我的代码

剪切了一个小的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
  };
};

我的问题

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

感谢。

1 个答案:

答案 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
  });
};