我正在将项目从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
)中设置它来实现这一点,但是对我来说感觉有点难看(我只想在编码风格中偏好)。任何帮助将不胜感激。
答案 0 :(得分:15)
您不能在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
的原型中:
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
将保留在对象本身中,而不是保存在原型中。例如:
class SomeView extends BaseView {
constructor() {
this.triggerMethod = Marionette.triggerMethod
// ...
}
}
这就是你所能做的一切。我认为第一和第二种变体是您的最佳选择,但这是一个品味问题。
答案 1 :(得分:-1)
如果我做对了你就可以用这种方式定义类方法:
class SomeView extends BaseView {
triggerMethod(){
Marionette.triggerMethod;
}
}
与coffeeScript几乎相同,但需要一些大括号。 我没试过这个,但请看http://wiki.ecmascript.org/doku.php?id=harmony:classes