我正在将项目从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!
}
您可以使用多种变体来解决您的问题:
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
// ...
}
}
那就是您所能做的。我认为第一个和第二个变体是您的情况的最佳选择,但这是一个品味问题。