node.js では、代わりに :
dummy = require('dummy')
dummy.aMethod()
dummy.anotherMethod()
コンテキストでメソッドを直接使用したい:
dummy = require('dummy')
loadMethods(dummy)
aMethod()
anotherMethod()
関数 loadMethods を実装するにはどうすればよいですか?
node.js では、代わりに :
dummy = require('dummy')
dummy.aMethod()
dummy.anotherMethod()
コンテキストでメソッドを直接使用したい:
dummy = require('dummy')
loadMethods(dummy)
aMethod()
anotherMethod()
関数 loadMethods を実装するにはどうすればよいですか?
できることの 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 を見つければ、タイピングは問題にならないはずです。
の可鍛性を活用してください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
コンテキストについて詳しく知ることができます