ES6:将函数应用为 class 方法

ES6: Applying function as class method

我正在将一个项目从 CoffeeScript 迁移到 ES6(使用 6to5 和 Browserify),并且 运行 可能遇到了限制,或者我只是不知道正确的语法。在 CoffeeScript 中我可以这样做:

class SomeView extends BaseView
    triggerMethod: Marionette.triggerMethod

如何在 ES6 中表达这个 类?我尝试了几件事,但无论我尝试什么,它都会抛出 Unexpected token 错误。例如:

let { triggerMethod } = Marionette;

class SomeView extends BaseView {
    triggerMethod, // doesn't work
    triggerMethod: Marionette.triggerMethod // doesn't work
}

现在我可以通过在构造函数中设置它来实现它 (this.triggerMethod = Marionette.triggerMethod),但我觉得它有点难看(我猜只是编码风格的偏好)。任何帮助将不胜感激。

如果我没看错,您可以这样定义 class 方法:

class SomeView extends BaseView {
    triggerMethod(){
      Marionette.triggerMethod; 
   }
}

与 coffeeScript 几乎相同,但需要一些大括号。 我没试过这个,但请参阅 http://wiki.ecmascript.org/doku.php?id=harmony:classes

不能在ES6中声明属性classes,只能声明方法和静态方法(class声明的语法见here,注意类元素)。所以下面的任何一个例子都是错误的:

class A {
    method1: B.someMethod  // wrong!
    method2: function() {} // wrong!
    method3: () => {}      // wrong!
}

您有多种变体来处理您的问题:

  1. 使用getter:

    class SomeView extends BaseView {
        get triggerMethod() { return Marionette.triggerMethod }
    }
    
  2. SomeViewtriggerMethod 调用 Marionette.triggerMethod class:

    class SomeView extends BaseView {
        triggerMethod() { 
            Marionette.triggerMethod.apply(this, arguments);
        }
    }
    
  3. 在class声明后SomeView的原型中添加triggerMethod

    class SomeView extends BaseView {
        //.. some class declaration
    }
    SomeView.prototype.triggerMethod = Marionette.triggerMethod;
    

    Object.assign:

    class SomeView extends BaseView {
        //.. some class declaration
    }
    
    Object.assign(SomeView.prototype, {
      triggerMethod: Marionette.triggerMethod
      // ... some another methods
    });
    
  4. 您已经完成的工作 - 将 Marionette.triggerMethod 添加到 this。但是您必须知道,在那种情况下 triggerMethod 将保留在对象本身中,而不是其原型中。示例:

    class SomeView extends BaseView {
        constructor() {
          this.triggerMethod =  Marionette.triggerMethod
          // ...
        }
    }
    

这就是您所能做的。我认为第一个和第二个变体是适合您的情况的最佳选择,但这只是个人喜好问题。