Javascript 工厂函数中是否可以省略属性?
我想知道是否可以避免在工厂函数中定义属性。我试着用和 让我解释清楚。假设我们有以下工厂函数:Javascript 工厂函数中是否可以省略属性?,javascript,javascript-objects,factory-pattern,destructuring,Javascript,Javascript Objects,Factory Pattern,Destructuring,我想知道是否可以避免在工厂函数中定义属性。我试着用和 让我解释清楚。假设我们有以下工厂函数: const create_game = (name, artist, release) => ({ name, artist, release, load() { console.log('Loading game...') } }) 我已经使用了一种称为属性值速记(property value shorthand)的解构技术,所以我
const create_game = (name, artist, release) =>
({
name,
artist,
release,
load() {
console.log('Loading game...')
}
})
我已经使用了一种称为属性值速记(property value shorthand)的解构技术,所以我不必重复属性赋值
name: name,
我的问题是,我是否可以更进一步,做一些类似的魔术:
const create_game = (name, artist, release) =>
({
...args,
load() {
console.log('Loading game...')
}
})
可能吗?如果将参数转换为对象,则可以执行以下操作:
const create\u game=attributes=>
({
…属性,
加载(){
console.log('正在加载游戏…')
}
})
创建_游戏({名称:'..',艺术家:'..',发行版:'..})
否则,如果您想让代码的未来读者刮目相看,您可以使用获取函数参数名称并执行魔术。看看这个怪物:
var STRIP\u COMMENTS=/(\/\/.$)|(\/\*[\s\s]*?\*\/)/mg;
变量参数名称=/([^\s,]+)/g;
函数getParamNames(func){
var fnStr=func.toString().replace(带注释“”);
var result=fnStr.slice(fnStr.indexOf('(')+1,fnStr.indexOf(')).match(参数名称);
如果(结果===null)
结果=[];
返回结果;
}
功能创建游戏(名称、艺术家、发行版){
常量参数=参数
const argumentNames=getParamNames(创建游戏)
const argsObject=argumentNames.reduce(
(acc,argName,index)=>({…acc,[argName]:_参数[index]}),{})
返回({
…argsObject,
加载(){
console.log('正在加载游戏…')
}
})
}
创建游戏(“asdf”、“qwer”、“uiop”)
//=>{name:“asdf”,artist:“qwer”,release:“uiop”,load:ƒ}
可能吗?
否,因为js引擎没有可用的参数名称
我认为这太过分了,但是您可以“注入”名称数组,并使用…rest
对象减少它
const create_game=(名称,…参数)=>
(Object.assign)({
加载(){
console.log('正在加载游戏…')
}
},names.reduce((a,c,i)=>Object.assign(a,{[c]:args[i]}),{}));
console.log(create_game([“name”,“artist”,“release”],“Ele”,“Foo”,“Bar”))
而不是使用3个参数,使用1(一个对象),例如(params)=>({…params,load(){console.log('load')})
“不,因为js引擎没有可用的参数名称。”不正确,引擎确实提供了一种方法(一个可怕的黑客)尼科加,你能给我解释一下,那黑客有多可怕吗?如果黑客与你的答案有关,让我告诉你,在这种情况下,引擎知道名字,因为你在声明,否则这是不可能的。当然。如果没有人给它起名字,怎么会有人知道它的名字呢?我不明白你的意思。