ES6:将函数应用为类方法

时间:2015-01-28 10:30:45

标签: javascript class syntax ecmascript-6

我正在将项目从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)中设置它来实现这一点,但是对我来说感觉有点难看(我只想在编码风格中偏好)。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:15)

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

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

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

  1. 使用getter:

    class SomeView extends BaseView {
        get triggerMethod() { return Marionette.triggerMethod }
    }
    
  2. Marionette.triggerMethod班级的triggerMethod致电SomeView

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

    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
          // ...
        }
    }
    
  5. 这就是你所能做的一切。我认为第一和第二种变体是您的最佳选择,但这是一个品味问题。

答案 1 :(得分:-1)

如果我做对了你就可以用这种方式定义类方法:

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

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