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引擎没有可用的参数名称。”不正确,引擎确实提供了一种方法(一个可怕的黑客)尼科加,你能给我解释一下,那黑客有多可怕吗?如果黑客与你的答案有关,让我告诉你,在这种情况下,引擎知道名字,因为你在声明,否则这是不可能的。当然。如果没有人给它起名字,怎么会有人知道它的名字呢?我不明白你的意思。