向ES6类动态添加函数的正确方法

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 方法稍微快一些,因为这段代码只执行一次,而每次创建新实例时都会执行构造函数代码.

的另一个优点prototypeconstructor是,它与类继承兼容.所以,如果你以后扩展你的课程,即使你重新定义任何这些方法,也不会有任何破坏.

顺便说一句,你可以在这里使用require('http').METHODSmethods打包而不是硬编码的HTTP谓词数组.