2012-03-07 8 views
0

私は最初のNode.jsプロジェクトに取り組んでおり、Node.jsでどのように解決できるかわからないOOP問題が発生しました。Node.jsでパラメータ化されたモジュールがロードされています

私は、モジュールAいます

module.exports = A; 

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

とA.今

と同じ "インターフェース" を実装カップル他のモジュール(BとCと言うことができます)、私はモジュール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__が関与すると思いますか?

編集:私が達成しようとしているのは、標準化されたインターフェイスnew X()を介していくつかの文字列値(ENV変数)に基づいて読み込み実装A、BまたはCであり、その後A(B、C ...) Xのインスタンス。

+0

ハァッを?おそらくあなたのサンプルコードですが、これがどのように動作するのか把握していないようです。あるいは、私はあなたの達成しようとしていることを理解していません。あなたがしようとしていると思っていることについて私の答えを見てください。 –

+1

Xにはファクトリメソッドが必要です。新しいA、X.create(A_B_or_C)から新しいBor新規Cを返す必要があります。 – mpm

答えて

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' 

keepiの代替NG XmodulesオブジェクトがX(impl)内部requireにあるとrequireはエラーをスローしましょう:

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

これは私のやり方とほぼ同じです。あなた自身のエラー処理をしたいが、モジュールの配列を保持したくない場合(例えばD、E、Fなどをかなり頻繁に追加するなど)、ノードのrequire.resolve()を使用して、要求されたモジュールが実際に要求する前に、要求されたモジュールが既知のモジュールの配列でそれを探す必要なく存在することを保証する機能です。 –

+0

私が実際にあなたが持っている最後のビットが動作しないことが分かった。なんらかの理由で、 'function X(impl){ var x = new require( './' + impl); xを返します。 } 'foo.method()'は、オブジェクトにメソッドがないことを示すエラーをスローします。 –

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" 

は正しいですか?

+0

まあ、並べ替え。それはAのプロトタイプで宣言されているので、私は 'impl.method()'を呼び出すことができません。また、これはXとAの両方のコンストラクタを呼び出すことはありません。 –

+0

データが厳密に型付けされていないため、これは簡単に行うことができます。プロトタイプをxの引数として渡します。次に、これらのクラスのインスタンスを返すことができます。 –

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'); 

これはまさに必要なものですか?

+0

+1説明 –

+0

ありがとうございます。ああ、私は 'var ParentClass = module.exports = ...'をエクスポートするのを忘れていました。 – kevin

関連する問題