【问题标题】:Javascript inheritance puzzles meJavascript继承让我困惑
【发布时间】:2018-06-18 23:21:29
【问题描述】:

我正在尝试理解 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 递归地将源对象的自己的和继承的可枚举字符串键控属性合并到目标对象中。在我的代码中,我似乎也犯了一个错字并以错误的顺序书写。我只是让它保持原样,从长远来看它可能会帮助其他人。

【问题讨论】:

  • JS 类仍然使用原型继承,顺便说一下。他们只是隐藏它。
  • 这真的是你能想出的最小最简单的演示吗?
  • 我会推荐凯尔辛普森的YDKJS,特别是this chapter
  • manager.js 必须位于我在代码中提供的同一文件夹中。还必须有名为workers 的文件夹,其中包含foo.jsbar.js
  • 不,那太复杂了。 minimal reproducible example 应该可以粘贴到一个简单的文件中。

标签: javascript node.js inheritance


【解决方案1】:
this.config = _.merge(default_config, this.config);

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

【讨论】:

  • 非常感谢您的帮助,先生。我在代码中使用config。如何为每个工作人员设置一个不会影响其他人的配置?
  • 我发现了错误。似乎 loadash merge 递归地将源对象的自己和继承的可枚举字符串键控属性合并到目标对象中。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2019-04-12
  • 2019-11-07
相关资源
最近更新 更多