5

node.js でモジュールを作成する方法に関する多くの記事を読みましたが、module.exports を使用して、それを含むファイルにモジュールの内部を公開できます..素晴らしい!

これはどのように逆に機能しますか?例として以下を使用します:-)

 USER.JS

 function User() {
   this.property = 'value';
   this.doSomething = function() {
     var getStuff = mainFileFunction();
     // do something with getStuff
 }

 module.exports = User;

 MAIN.JS

 var myArray = [];
 myArray.push('something');
 myArray.push('something else');
 mainFileFunction() {
   for(thing in myArray) {
     return myArray[thing];
   }
 }

 var u = new user();

 log(u.property);  <---  THIS IS EXPOSED, COOL!

 u.doSomething();  <--- This will throw an error because mainFileFunction is not defined in user.js :-(

mainFileFunction をユーザー ファイルに移動したとしても、myArray 配列が定義されないため、まだ機能しません...そして、それも移動すると、それを使用できなくなりますメインの他の機能(私がしたい):-)

ここで本当に明白なものが欠けている場合は申し訳ありません...私が欲しいのは、私がインクルードするモジュールから選択した部分を公開することです(module.exportはそのために機能します)が、メインファイルからすべてを公開したいですすべてのインクルードに..

または単にすべてをすべてに公開しますか?それは完全に厄介で恐ろしいですか??

ここで何をしようとしているのかを説明するために...クラスを別々のファイルで定義したいのですが、それらの束をメインファイルのオブジェクトとしてインスタンス化し、それらを配列に格納したい..オブジェクトを他のオブジェクト型の配列にアクセスできるメソッドが含まれています。

みんなありがとう!:-)

4

4 に答える 4

7

グローバル使用するか、適切な循環依存関係 (両方のファイルを ing) を持つことができますrequireが、これは通常、将来の保守性の問題につながる可能性のある悪い習慣です。

代わりに、依存性注入を使用doSomethingして、モジュールに注入できます。これにより、基本的に無料で以下が提供されます。

  • Userlaterの簡単なモック実装でテストし、doSomethingコードの正確性を検証できます
  • ユーザーの依存関係は明示的で暗黙的ではないため、ユーザーが何を必要としているのかが明確になります。

2 つの実装を提供します。1 つはコンストラクター依存性注入を使用し、もう 1 つはモジュール全体の設定を使用します。

 USER.JS

 function User(dependentFunction) {
   this.property = 'value';
   this.doSomething = function() {
     var getStuff = dependentFunction();
     // do something with getStuff
   }
 }

 module.exports = User;

MAIN.JS
...
var u = new User(mainFileFunction);
u.doSomething(); // this will now work, using mainFileFunction

ここで起こることはかなり単純で、何が起こっているかはわかっています。

これは、モジュール全体の設定にすることもできます

USER.JS

function User(depFunc) {
  this.property = 'value';
  this.doSomething = function() {
    var getStuff = depFunc();
    // do something with getStuff
  }
}
function UserFactory(depFunc){ 
    return function(){
        return new User(depFunc);
    }
}
module.exports = UserFactory;

MAIN.JS

 var getUser = UserFactory(mainFileFunction);
 var u = getUser(); // will return a new user with the right function
于 2013-08-27T20:21:13.137 に答える
1

依存性注入に対するベンジャミンの回答に+1。require('./module.js')(dependentFunction); のように依存関係を require('./module.js')(dependentFunction); のように渡すことで、モジュールにオブジェクトを挿入する別の方法を追加したいと思います。

//MAIN.js
var db = function() {
    this.rows = [];
    this.insert = function(name) {
        this.rows.push(name);
        console.log('Db: Inserting user with name ' + name);
    }
    this.getAll = function(){
        return this.rows;
    }
}
var fakeDb = new db();
var user = require('./user.js')(fakeDb);
user.add('Jhon');
user.add('Rose');
user.list();

//users.js
module.exports = function(db) {
    return {
        add: function(name) {
            db.insert(name);
        },
        list: function() {
           var users =  db.getAll();
           var i = users.length;
           console.log('listing users\n-------');
           while(i--) {
               console.log(users[i]);
           }
        }
    }
}
于 2013-08-27T22:03:11.003 に答える
0

mainFileFunctionユーザーのコンストラクターにパラメーターとして渡す必要があります。

USER.JS

 function User(mainFileFunction) {
   this.property = 'value';
   this.doSomething = function() {
     var getStuff = mainFileFunction();
     // do something with getStuff
 }

 module.exports = User;

main.js で以下を使用します

var u = new user(mainFileFunction);

于 2013-08-27T20:22:52.163 に答える
0

mainFileFunction を user.js に移動して、関数が引数として配列を受け入れるようにするのはどうですか。

mainFileFunction(array) {
   for(thing in array) {
     return array[thing];
   }
 }

次に、main.js から呼び出すときに、関数に配列を渡します。

u.doSomething(myArray);
于 2013-08-27T20:25:08.667 に答える