Node.js中的参数化模块加载

时间:2012-03-07 09:45:22

标签: oop node.js

我正在开发我的第一个Node.js项目,我遇到了一个OOP问题,我不确定如何在Node.js中解决。

我有一个模块A:

module.exports = A;

function A() {
}
A.prototype.method = function() { return "A";};
//other methods...

并将其他模块(比如B和C)与A实现相同的“接口”。

现在,我有模块X:

module.exports = X;

function X(impl) {
  //choose A, B, or C based on value of impl
}

所以问题是,我如何实现X才能做到:

var X = require("x");
var impl = new X("A");
impl.method(); //returns "A"

我相信prototype__proto__会参与其中吗?

编辑:我想要实现的是加载实现A,B或C,基于一些字符串值(ENV变量)通过标准化接口new X()然后访问方法A(B,C ... )通过X的实例。

3 个答案:

答案 0 :(得分:2)

我认为这就是你所追求的:

A.js(B.js和C.js当然相似):

function A() {}

A.prototype.method = function() {
    return 'A';
};

module.exports = A;

X.js:

var modules = {
    A: require('./A'),
    B: require('./B'),
    C: require('./C')
}

function X(impl) {
    if(impl in modules)
        return new modules[impl];
    else
        throw new Error('Unknown impl: ' + impl);
}

module.exports = X;

用法:

var foo = new X('A');
foo.method();
// => 'A'
var bar = new X('B');
bar.method()
// => 'B'

modules对象保留在X中的另一种方法是require内的X(impl),让require抛出错误:

function X(impl) {
    return new require('./' + impl);
}

答案 1 :(得分:1)

要调用父构造函数,您需要在新对象的上下文中实际调用/应用它。见[1]。

要继承方法,您需要将原型从父类克隆到子类。见[2]

// parentclass.js
var ParentClass = function (arg) {
    console.log("Calling ParentClass constructor with " + arg);
};

ParentClass.prototype.method = function (arg) {
    console.log("Calling ParentClass method with " + arg);
};

// childclass.js
var ChildClass = function () {
    console.log("Calling ChildClass constructor");
    // [1]
    ParentClass.apply(this, arguments);
};

// [2]
ChildClass.prototype = Object.create(ParentClass.prototype);

var instance = new ChildClass('some argument');
instance.method('ahahahah');

这正是你需要的吗?

答案 2 :(得分:0)

//x.js
module.exports = function(a) {
   return a;
}

//a.js
modules.exports = function() {
return {method: function() { return "A" } };
}

var X = require("x");

var impl = new X(require("a"));

impl.method(); //returns "A"

是正确的吗?