0

使用来自此来源的示例

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

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

const murderRobotDog = (name)  => {
  let state = {
    name,
    speed: 100,
    position: 0
  }
  return Object.assign(
        {},
        barker(state),
        driver(state)
    )
}

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

例如,我可以有一个名称数组,如下所示:

let properties = ["barker", "driver", "killer" etc... ];
murderRobotDog(name, properties);

它是否 Object.assign 给每个函数名称?

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

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

只是意识到这不是任何一种工作方式。也无法真正弄清楚如何从中进行循环。这应该怎么做?

4

1 回答 1

1

您可以创建一个字典,其中键构成函数名称。然后你可以遍历属性并执行 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
于 2017-12-06T13:22:10.563 回答