0

node.js では、代わりに :

dummy = require('dummy')

dummy.aMethod()
dummy.anotherMethod()

コンテキストでメソッドを直接使用したい:

dummy = require('dummy')
loadMethods(dummy)

aMethod()
anotherMethod()

関数 loadMethods を実装するにはどうすればよいですか?

4

2 に答える 2

2

できることの 1 つはwith、次のように を使用することです。

with (dummy) {
  aMethod();
  anotherMethod();
}

ただし、多くのことが曖昧になり、期待どおりに動作しないため、お勧めしません。

求めていることを正確に行うために、これらのメソッドをglobalオブジェクトに追加できます。次のようなものを使用できます。

for (var prop in dummy) {
  if (dummy.hasOwnProperty(prop)) {
    global[prop] = dummy[prop];
  }
}

ただし、このアプローチにも制限があります。たとえば、関数の本体で aMethod() を使用することはできません。thisオブジェクトは正しくありません (もちろん、bind正しい状態を維持するために使用できます)。また、実際にglobalはグローバルではありませんが、モジュールスコープであるため、すべてのモジュールが独自のglobalオブジェクトを取得します。

したがって、オプションを比較検討すると、おそらく から までの方法を使用することに固執する必要がありますdummy。このようにして、常に期待される動作が得られ (thisになりますdummy)、使用しているメソッドが実際にdummyモジュールに実装され、その状態を使用していることが明確に示されます。良い IDE を見つければ、タイピングは問題にならないはずです。

于 2012-08-10T22:22:36.963 に答える
1

の可鍛性を活用してくださいthis。関数が特定のスコープにバインドされずに呼び出されるとthis.call.apply、またはメソッドコンテキストで実行できます)this、グローバルオブジェクトを参照します。このコードは、Node.jsだけでなくブラウザーでも機能しますが、もちろん、同じ名前の他のグローバルスコープの関数を上書きします。注意して使用してください...一般的には使用しないことをお勧めします。

function loadMethods(obj) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof(obj[prop]) === 'function') {
            this[prop] = obj[prop]
        }
    }
}

ここでthisコンテキストについて詳しく知ることができます

于 2012-08-10T22:51:40.270 に答える