JavaScript 组成工厂

示例

“优先于继承而不是继承”是一种重要且流行的编程原理,用于将行为分配给对象,而不是继承许多通常不需要的行为。

行为工厂

var speaker = function (state) {
    var noise =state.noise|| 'grunt';

    return {
        speak: function () {
            console.log(state.name + ' says ' + noise);
        }
    };
};

var mover = function (state) {
    return {
        moveSlowly: function () {
            console.log(state.name + ' is moving slowly');
        },
        moveQuickly: function () {
            console.log(state.name + ' is moving quickly');
        }
    };
};

对象工厂

6
var person = function (name, age) {
    var state = {
        name: name,
        age: age,
        noise: 'Hello'
    };

    return Object.assign(     // 合并我们的“行为”对象
        {},
        speaker(state),
        mover(state)
    );
};

var rabbit = function (name, colour) {
    var state = {
        name: name,
        colour: colour
    };

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

用法

var fred = person('Fred', 42);
fred.speak();        // 输出:Fred说你好
fred.moveSlowly();   // 输出:Fred动作缓慢

var snowy = rabbit('Snowy', 'white');
snowy.moveSlowly();  // 输出:Snowy移动缓慢
snowy.moveQuickly(); // 输出:Snowy快速移动
snowy.speak();       // 错误:snowy.speak不是函数