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应该是一个例子,我的代码中没有使用它:)让我们来看看。