Ste*_*ven 10 javascript syntax class ecmascript-6
我正在将一个项目从CoffeeScript迁移到ES6(使用6to5和Browserify),并且可能遇到限制,或者我只是不知道正确的语法.在CoffeeScript中,我可以这样做:
class SomeView extends BaseView
triggerMethod: Marionette.triggerMethod
Run Code Online (Sandbox Code Playgroud)
我如何在ES6课程中表达这一点?我尝试了几件事,但Unexpected token无论我尝试什么,它都会抛出错误.这例如:
let { triggerMethod } = Marionette;
class SomeView extends BaseView {
triggerMethod, // doesn't work
triggerMethod: Marionette.triggerMethod // doesn't work
}
Run Code Online (Sandbox Code Playgroud)
现在我可以通过在构造函数(this.triggerMethod = Marionette.triggerMethod)中设置它来实现这一点,但是对我来说感觉有点难看(我猜的只是编码风格的偏好).任何帮助,将不胜感激.
ale*_*ods 15
您不能在ES6类中声明属性,只能声明方法和静态方法(请参阅此处了解类声明的语法,注意ClassElement).因此,以下任何示例都是错误的:
class A {
method1: B.someMethod // wrong!
method2: function() {} // wrong!
method3: () => {} // wrong!
}
Run Code Online (Sandbox Code Playgroud)
您有几种变体可以解决您的问题:
使用getter:
class SomeView extends BaseView {
get triggerMethod() { return Marionette.triggerMethod }
}
Run Code Online (Sandbox Code Playgroud)呼叫Marionette.triggerMethod从triggerMethod的SomeView类:
class SomeView extends BaseView {
triggerMethod() {
Marionette.triggerMethod.apply(this, arguments);
}
}
Run Code Online (Sandbox Code Playgroud)添加triggerMethod到SomeView课后声明的原型:
class SomeView extends BaseView {
//.. some class declaration
}
SomeView.prototype.triggerMethod = Marionette.triggerMethod;
Run Code Online (Sandbox Code Playgroud)
或者Object.assign:
class SomeView extends BaseView {
//.. some class declaration
}
Object.assign(SomeView.prototype, {
triggerMethod: Marionette.triggerMethod
// ... some another methods
});
Run Code Online (Sandbox Code Playgroud)你已经做了什么 - 添加Marionette.triggerMethod到this.但是你必须意识到,在这种情况下,triggerMethod它将被保存在对象本身中,而不是它的原型中.例:
class SomeView extends BaseView {
constructor() {
this.triggerMethod = Marionette.triggerMethod
// ...
}
}
Run Code Online (Sandbox Code Playgroud)这就是你所能做的一切.我认为第一和第二种变体是您的最佳选择,但这是一个品味问题.
| 归档时间: |
|
| 查看次数: |
2827 次 |
| 最近记录: |