我正在将一个项目从 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
),但对我来说感觉有点难看(我猜只是编码风格的偏好)。任何帮助将不胜感激。
最佳答案
不能在 ES6 类中声明属性,只能声明方法和静态方法(参见 here 类声明语法,注意 ClassElement)。所以下面的任何一个例子都是错误的:
class A {
method1: B.someMethod // wrong!
method2: function() {} // wrong!
method3: () => {} // wrong!
}
您有多种变体来处理您的问题:
使用 setter/getter :
class SomeView extends BaseView { get triggerMethod() { return Marionette.triggerMethod } }
从
SomeView
类的triggerMethod
调用Marionette.triggerMethod
:class SomeView extends BaseView { triggerMethod() { Marionette.triggerMethod.apply(this, arguments); } }
在
SomeView
类声明后的原型(prototype)中添加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 });
您已经完成的工作 - 将
Marionette.triggerMethod
添加到this
。但是您必须知道,在那种情况下,triggerMethod
将保存在对象本身中,而不是其原型(prototype)中。示例:class SomeView extends BaseView { constructor() { this.triggerMethod = Marionette.triggerMethod // ... } }
这就是你所能做的。我认为第一个和第二个变体是您案例的最佳选择,但这是个人喜好问题。
关于javascript - ES6 : Applying function as class method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28189931/