我正在开发我的第一个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的实例。
答案 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"
是正确的吗?