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
  };
};

我的问题

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

谢谢。

您的缩进错误。还要注意,您忘记了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
  });
};

最新更新