ES6:将函数应用为类方法

Ste*_*ven 10 javascript syntax class ecmascript-6

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

class SomeView extends BaseView
    triggerMethod: Marionette.triggerMethod
Run Code Online (Sandbox Code Playgroud)

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

let { triggerMethod } = Marionette;

class SomeView extends BaseView {
    triggerMethod, // doesn't work
    triggerMethod: Marionette.triggerMethod // doesn't work
}
Run Code Online (Sandbox Code Playgroud)

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

ale*_*ods 15

您不能在ES6类中声明属性,只能声明方法和静态方法(请参阅此处了解类声明的语法,注意ClassElement).因此,以下任何示例都是错误的:

class A {
    method1: B.someMethod  // wrong!
    method2: function() {} // wrong!
    method3: () => {}      // wrong!
}
Run Code Online (Sandbox Code Playgroud)

您有几种变体可以解决您的问题:

  1. 使用getter:

    class SomeView extends BaseView {
        get triggerMethod() { return Marionette.triggerMethod }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 呼叫Marionette.triggerMethodtriggerMethodSomeView类:

    class SomeView extends BaseView {
        triggerMethod() { 
            Marionette.triggerMethod.apply(this, arguments);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加triggerMethodSomeView课后声明的原型:

    class SomeView extends BaseView {
        //.. some class declaration
    }
    SomeView.prototype.triggerMethod = Marionette.triggerMethod;
    
    Run Code Online (Sandbox Code Playgroud)

    或者Object.assign:

    class SomeView extends BaseView {
        //.. some class declaration
    }
    
    Object.assign(SomeView.prototype, {
      triggerMethod: Marionette.triggerMethod
      // ... some another methods
    });
    
    Run Code Online (Sandbox Code Playgroud)
  4. 你已经做了什么 - 添加Marionette.triggerMethodthis.但是你必须意识到,在这种情况下,triggerMethod它将被保存在对象本身中,而不是它的原型中.例:

    class SomeView extends BaseView {
        constructor() {
          this.triggerMethod =  Marionette.triggerMethod
          // ...
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

这就是你所能做的一切.我认为第一和第二种变体是您的最佳选择,但这是一个品味问题.