通过将功能列表传递给工厂函数在javascript中组合对象

通过将功能列表传递给工厂函数在javascript中组合对象,javascript,ecmascript-6,object-composition,Javascript,Ecmascript 6,Object Composition,举一个例子 我应该如何修改此代码,以便能够根据传递给factory函数的参数分配功能 例如,我可以有这样一个名称数组: let properties = ["barker", "driver", "killer" etc... ]; murderRobotDog(name, properties); 它会把Object.assign分配给每个函数名吗 我仍在学习新语法,我尝试使用如下扩展运算符: return Object.assign({}, ...properties(state));

举一个例子

我应该如何修改此代码,以便能够根据传递给factory函数的参数分配功能

例如,我可以有这样一个名称数组:

let properties = ["barker", "driver", "killer" etc... ];
murderRobotDog(name, properties);
它会把Object.assign分配给每个函数名吗

我仍在学习新语法,我尝试使用如下扩展运算符:

return Object.assign({}, ...properties(state));

结果才意识到,这不是任何一种工作方式。我也不知道该怎么做一个循环。应该如何做到这一点?

您可以创建一个字典,其中键构成函数名。然后,您可以在属性上循环并执行Object.assign:

const barker = (state) => ({
    bark: () => console.log('Woof, I am ' + state.name)
});

const driver = (state) => ({
    drive: () => state.position = state.position + state.speed
});

let types = {
    barker,
    driver
};

const murderRobotDog = (name, properties) => {
    let state = {
        name,
        speed: 100,
        position: 0
    };

    let obj = {};
    for(let prop of properties) {
        Object.assign(obj, types[prop](state));
    }

    return obj;
}

let properties = ["barker", "driver"];
let result = murderRobotDog('Name', properties);
console.log(result);
result.bark()
输出:

node .\index.js
{ bark: [Function: bark], drive: [Function: drive] }
Woof, I am Name

它是否需要一个名称数组?一组属性(
[barker,driver,killer]
)会简单得多
node .\index.js
{ bark: [Function: bark], drive: [Function: drive] }
Woof, I am Name