ES6:将函数应用为 class 方法
ES6: Applying function as class method
我正在将一个项目从 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
),但我觉得它有点难看(我猜只是编码风格的偏好)。任何帮助将不胜感激。
如果我没看错,您可以这样定义 class 方法:
class SomeView extends BaseView {
triggerMethod(){
Marionette.triggerMethod;
}
}
与 coffeeScript 几乎相同,但需要一些大括号。
我没试过这个,但请参阅 http://wiki.ecmascript.org/doku.php?id=harmony:classes
不能在ES6中声明属性classes,只能声明方法和静态方法(class声明的语法见here,注意类元素)。所以下面的任何一个例子都是错误的:
class A {
method1: B.someMethod // wrong!
method2: function() {} // wrong!
method3: () => {} // wrong!
}
您有多种变体来处理您的问题:
使用getter:
class SomeView extends BaseView {
get triggerMethod() { return Marionette.triggerMethod }
}
从 SomeView
的 triggerMethod
调用 Marionette.triggerMethod
class:
class SomeView extends BaseView {
triggerMethod() {
Marionette.triggerMethod.apply(this, arguments);
}
}
在class声明后SomeView
的原型中添加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
将保留在对象本身中,而不是其原型中。示例:
class SomeView extends BaseView {
constructor() {
this.triggerMethod = Marionette.triggerMethod
// ...
}
}
这就是您所能做的。我认为第一个和第二个变体是适合您的情况的最佳选择,但这只是个人喜好问题。
我正在将一个项目从 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
),但我觉得它有点难看(我猜只是编码风格的偏好)。任何帮助将不胜感激。
如果我没看错,您可以这样定义 class 方法:
class SomeView extends BaseView {
triggerMethod(){
Marionette.triggerMethod;
}
}
与 coffeeScript 几乎相同,但需要一些大括号。 我没试过这个,但请参阅 http://wiki.ecmascript.org/doku.php?id=harmony:classes
不能在ES6中声明属性classes,只能声明方法和静态方法(class声明的语法见here,注意类元素)。所以下面的任何一个例子都是错误的:
class A {
method1: B.someMethod // wrong!
method2: function() {} // wrong!
method3: () => {} // wrong!
}
您有多种变体来处理您的问题:
使用getter:
class SomeView extends BaseView { get triggerMethod() { return Marionette.triggerMethod } }
从
SomeView
的triggerMethod
调用Marionette.triggerMethod
class:class SomeView extends BaseView { triggerMethod() { Marionette.triggerMethod.apply(this, arguments); } }
在class声明后
SomeView
的原型中添加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
将保留在对象本身中,而不是其原型中。示例:class SomeView extends BaseView { constructor() { this.triggerMethod = Marionette.triggerMethod // ... } }
这就是您所能做的。我认为第一个和第二个变体是适合您的情况的最佳选择,但这只是个人喜好问题。