Yan*_*oto 24 javascript idiomatic ecmascript-6
我有一个简单的类,只有一个方法exec(arg1,..,argn),我希望有一些别名方法调用exec预定义的参数值(例如exec_sync = exec.bind(this, true)).
以下是诀窍:
class Executor {
constructor() {
this.exec_sync = this.exec.bind(this, true);
}
exec(sync, cmd, args/* ... */) {
// impl
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道这是不是一个好主意,或者这对ES6来说是否是惯用的.
UDATE:
在一个现实生活中的例子中,我有两个嵌套循环,分别有3个和4个循环,用于动态地向类中添加12个别名方法.当您真正可以利用JS作为基于原型的编程语言时,显式定义别名方法将是一项繁琐的任务.
更新2 - 示例:
假设我们有有一个方法,一个简单的HTTP客户端request(method, body),我们希望提供别名方法GET,PUT等等.它看起来像下面这样:
class HTTP {
constructor() {
['GET', 'PUT', 'POST', 'DEL'].forEach((method) => {
this[method] = this.request.bind(this, method);
}, this);
}
request(method, body) {
// execute the HTTP request
}
}
Run Code Online (Sandbox Code Playgroud)
Leo*_*tny 35
你的解决方案很好,尽管在一个prototype级别创建所有这些方法会更好:
['GET', 'PUT', 'POST', 'DEL'].forEach((method) => {
Executor.prototype[method] = function (body) {
return this.request(method, body)
}
})
Run Code Online (Sandbox Code Playgroud)
prototype 方法稍微快一些,因为这段代码只执行一次,而每次创建新实例时都会执行构造函数代码.
的另一个优点prototype在constructor是,它与类继承兼容.所以,如果你以后扩展你的课程,即使你重新定义任何这些方法,也不会有任何破坏.
顺便说一句,你可以在这里使用require('http').METHODS或methods打包而不是硬编码的HTTP谓词数组.
| 归档时间: |
|
| 查看次数: |
12017 次 |
| 最近记录: |