【问题标题】:ES6: Applying function as class methodES6:将函数作为类方法应用
【发布时间】:2015-01-28 10:30:44
【问题描述】:

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

【问题讨论】:

    标签: javascript class syntax ecmascript-6


    【解决方案1】:

    在 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. triggerMethodSomeView 类中调用Marionette.triggerMethod

      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
            // ...
          }
      }
      

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

    【讨论】:

    • 在这种情况下 Marionette.triggerMethod.apply(this, arguments); 它失败了,因为 Marionette.triggerMethod 未定义。它看到我的班级木偶,但是当我尝试访问 triggerMethod 时 - 它不可用。我也试过 (new Marionette).triggerMethod.apply(this, args) 它执行但它没有看到 this 没有从所需的类范围重新分配
    【解决方案2】:

    如果我做对了,你可以这样定义类方法:

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

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

    【讨论】:

    • 你定义它的方式,triggerMethod 并没有真正做任何事情。它引用了Marionette.triggerMethod,但它不执行它。
    猜你喜欢
    • 2018-04-16
    • 2016-07-03
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多