Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向ES6类动态添加函数的正确方法_Javascript_Ecmascript 6_Idioms - Fatal编程技术网

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

Javascript 向ES6类动态添加函数的正确方法,javascript,ecmascript-6,idioms,Javascript,Ecmascript 6,Idioms,我有一个简单的类,其中有一个方法exec(arg1,…,argn),我想有一些别名方法,它们使用预定义的参数值调用exec(例如exec\u sync=exec.bind(this,true)) 下面是一个技巧: 类执行器{ 构造函数(){ this.exec_sync=this.exec.bind(this,true); } exec(同步、命令、参数/*…*/){ //恳求 } } 但是我不知道这是个好主意还是ES6的惯用做法 UDATE: 在一个实际示例中,我有两个嵌套循环,分别有3个和

我有一个简单的类,其中有一个方法
exec(arg1,…,argn)
,我想有一些别名方法,它们使用预定义的参数值调用
exec
(例如
exec\u sync=exec.bind(this,true)

下面是一个技巧:

类执行器{
构造函数(){
this.exec_sync=this.exec.bind(this,true);
}
exec(同步、命令、参数/*…*/){
//恳求
}
}
但是我不知道这是个好主意还是ES6的惯用做法

UDATE:


在一个实际示例中,我有两个嵌套循环,分别有3个和4个循环,用于动态地向类添加总共12个别名方法。当您实际上可以利用JS作为基于原型的编程语言时,显式定义别名方法将是一项繁琐的任务

更新2-示例:

假设我们有一个简单的HTTP客户机,它有一个方法
请求(方法,主体)
,我们想为
获取
放置
等提供别名方法。它看起来类似于以下内容:

class-HTTP{
构造函数(){
['GET','PUT','POST','DEL'].forEach((方法)=>{
this[method]=this.request.bind(this,method);
},这个);
}
请求(方法、正文){
//执行HTTP请求
}
}

我不知道这是否是惯用的(因为它更多的是关于设计,而不是编程语言本身),但我个人认为创建显式函数会更好:

exec_sync(...args) {
    return this.exec(true, ...args); 
}

您的解决方案很好,但最好在
原型
级别创建所有这些方法一次:

['GET', 'PUT', 'POST', 'DEL'].forEach((method) => {
  Executor.prototype[method] = function (body) {
    return this.request(method, body)
  }
})
prototype
方法稍微快一点,因为此代码只执行一次,而每次创建新实例时都会执行构造函数代码

与构造函数相比,
prototype
的另一个优点是它与类继承兼容。因此,如果您以后要扩展类,那么如果您重新定义这些方法中的任何一个,都不会出现收支平衡的情况


顺便说一句,您可以使用
require('http')。方法
或在这里代替硬编码的http谓词数组。

我喜欢@leonid的答案,但是当您使用动态计算属性名称时,是否有允许损坏的方法

['VERYBIGNAME', 'VERYBIGNAME2', 'VERYBIGNAME3'].forEach((method) => {
   Executor.prototype[method] = function (body) {
     return this.request(method, body)
   }
})
在缩小和损坏的javascript中,这些VERYBIGNAME字符串将存在

因此,如果我能够获得这些VERYBIGNAME函数的引用,我可以使用类似

const references = { VERYBIGNAME1, VERYBIGNAME2, VERYBIGNAME3 };

Object.assign(Executor.prototype, { ...references });

为什么不显式地创建多个函数
exec_sync(…args){返回this.exec(true,…args);}
@zerkms我想这会更清楚类的作用。我只是对这样做的可能性感兴趣。ES6类只是语法糖。在运行时向对象添加属性方面没有任何变化。在一个实际示例中,我有两个嵌套循环,分别有3个和4个项,用于向类动态添加总共12个项。手动添加所有内容会有点麻烦。@YanFoto当时我会考虑将其移动到一个单独的类中。这些方法实际上在语义上都属于该类。如果我将它们移动到一个单独的类中,我仍然需要显式地定义它们。还是我遗漏了什么?@YanFoto那些只是帮手的包装。但同样,这是一个品味或偏好的设计问题。没有一个客观的答案。我感谢你的帮助。我举了一个例子,在某种程度上澄清了这种情况。我想避免下一个开发者认为我的代码很难看:DThanks。http应该是一个例子,我的代码中没有使用它:)让我们来看看。