Параметризованная загрузка модуля в Node.js - PullRequest
0 голосов
/ 07 марта 2012

Я работаю над своим первым проектом Node.js и столкнулся с проблемой ООП, которую я не знаю, как решить в 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 ]

2 голосов
/ 07 марта 2012

Я думаю, это то, что вам нужно:

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 голос
/ 07 марта 2012

Чтобы вызвать родительский конструктор, вам нужно вызвать / применить его в контексте нового объекта.См. [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');

Это именно то, что вам нужно?

0 голосов
/ 07 марта 2012
//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"

это правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...