2011-06-19 10 views
2

私はノードのファイルシステムモジュールにいくつかの便利な機能を追加しようとしていましたが(主にいくつかの常識的なことがないため)、fs.prototype.myfunc =をreplで始めるたびに、未定義の変数のプロパティを設定しようとしています。 Nodeの組み込みモジュールのプロトタイプに外部からアクセスできないのは本当ですか?もしそうなら、誰もNodeの組み込みモジュールを拡張するための実現可能な回避策を知っていますか?NodeJSで組み込みモジュールをプロトタイプ化する

ちょうど注意してください:プロトタイプを作成する前にfsが必要でした。

https://github.com/mikeal/node-utils/blob/master/file/lib/main.js

答えて

6

require( '')に対する返信は、特定のモジュールによって異なります。一部のモジュールは、この操作を行います。その場合の

module.exports = function() {} 

を、返された値は、関数になりますので、あなたが物事を付けることができ、プロトタイプを持っているでしょう。

他のモジュールは、既存のexports.moduleオブジェクトの値を設定するだけです。例:

module.exports.someFunc = function(){} 

module.exportsはだけで、本質的です:彼らは後者を行うFSモジュールの場合

module.exports = {} 

var fs = exports; 

.... 

fs.readFileSync = function(path, encoding) { 

ですから、あなたがエラーを取得します返されるオブジェクトは関数ではないからです。あなたはこれをしなかった場合は、同じエラーを取得したい:

var x = {}; 

x.prototype.myfunc = function(){} 

あなただけ行うことができます注:

var fs = require('fs'); 

fs.myFunc = function(){} 
+1

もちろん!クイックテストは、あなたが絶対に正しいことを示しています(そして、私は思ったように私はJSについてよく分かりません)。これを説明してくれてありがとう! –

1

は、ここでそれを行う方法の例です。余分な機能を得るためにrequire('fs-monkeypatch')を実行すると、require('fs')は混乱します。 fsモジュールの外に関数を追加するだけです。

+0

はすでにそれは...まだエラーをスローでした。 –

1

回避策があるかもしれませんが、ノードは、あなたが猿そのモジュールにパッチを適用させないことで、あなたにメッセージを送っている:

var fs = require('fs'); 
fs.prototype.myfunc = function() {}; //TypeError thrown here 
+0

ポイントを獲得しました。あなたは単にモジュールを拡張することはできません(読んで:現行の機能を悪意のあるものに置き換えない)が、それは理由のために行われたと確信しています。私はおそらくあなたの提案に行き、必要なファイルに関数を追加します。入力いただきありがとうございます! –

関連する問題