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

class SomeView extends BaseView
    triggerMethod: Marionette.triggerMethod

如何在ES6类(class)中表达这一点?我尝试了几件事,但是无论我尝试如何,都会引发Unexpected token错误。例如:
let { triggerMethod } = Marionette;

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

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

最佳答案

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

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

您可以使用多种变体来解决您的问题:
  • 使用getter:
    class SomeView extends BaseView {
        get triggerMethod() { return Marionette.triggerMethod }
    }
    
  • Marionette.triggerMethod类的triggerMethod调用SomeView:
    class SomeView extends BaseView {
        triggerMethod() {
            Marionette.triggerMethod.apply(this, arguments);
        }
    }
    
  • 在类声明之后,将triggerMethod添加到SomeView的原型(prototype)中:
    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
    });
    
  • 您已经做了什么-将Marionette.triggerMethod添加到this中。但是您必须知道,在这种情况下,triggerMethod将保留在对象本身中,而不是在其原型(prototype)中。例子:
    class SomeView extends BaseView {
        constructor() {
          this.triggerMethod =  Marionette.triggerMethod
          // ...
        }
    }
    

  • 那就是您所能做的。我认为第一个和第二个变体是您的情况的最佳选择,但这是一个品味问题。

    10-04 11:31