Javascript继承困惑我

时间:2018-01-09 20:46:42

标签: javascript node.js inheritance

我正在尝试理解JavaScript继承,我遇到了障碍。我不熟悉JavaScript基于原型的继承。我仍在使用旧的NodeJS版本,所以我不能使用类。

你能告诉我为什么下面的代码为不同的工人打印相同的值,我该如何防止它?

var Manager = require('./manager');

var worker1 =  new Manager.getWorker('foo');
var worker2 =  new Manager.getWorker('bar');

console.log(worker1.config);
console.log(worker2.config);

//Implementation Details

//Manager
(function() {
    'use strict';

    function Manager() {

    }

    Manager.getWorker = function(slug) {
        var Worker = null;
        try {
            Worker = require('./workers/' + slug);
            Worker = new Worker();
        } catch (e) {
            console.log('Worker error: cannot initiate worker');
        }
        return Worker;
    };
    module.exports = Manager;
})();

//foo.js
(function () {
    var _abstract = require('../abstract_worker');
    var _util = require('util');


    var config = {
        "slug": "foo",
        "name": "Foo Worker"
    };

    function Foo() {
        this.config = config;
        Foo.super_.apply(this,arguments);
    }
    _util.inherits(Foo, _abstract);
    module.exports = Foo;
})();

//bar.js
'use strict';

(function () {
    var _abstract = require('../abstract_worker');
    var _util = require('util');


    var config = {
        "slug": "bar",
        "name": "Bar Worker"
    };

    function Bar() {
        this.config = config;
        Bar.super_.apply(this,arguments);
    }
    _util.inherits(Bar, _abstract);
    module.exports = Bar;
})();

(function() {
    'use strict';
    //config
    var _ = require('lodash');

    var default_config = {
        number_of_job: 1
    };

    function AbstractWorker() {
        if (!this.config) {
            this.config = {};
        }

        if (!_.isString(this.config.slug)) {
            throw new Error('config.slug is undefined.');
        }

        if (!_.isString(this.config.name)) {
            throw new Error('config.name is undefined.');
        }
        this.config = _.merge(default_config, this.config);
    }
    module.exports = AbstractWorker;

})();

编辑:感谢@Bergi我找到了错误的来源。似乎Lodash的merge以递归方式将源对象的自身和继承的可枚举字符串键控属性合并到目标对象中。在我的代码中,似乎我也写了一个拼写错误并且写错了。我只是留下它,因为它可能从长远来看可以帮助其他人。

1 个答案:

答案 0 :(得分:0)

this.config = _.merge(default_config, this.config);

是你的问题。它为所有工作人员分配了相同的default_config对象。