ここでの問題は、それhasOwnProperty()
がオブジェクトのメソッドであり、その機能全体がそのオブジェクトのプロパティを操作することです。そのため、呼び出されたときに適切なオブジェクト コンテキストが与えられた場合にのみ機能します。通常、これらはメソッドとして記述されておりthis
、メソッドが呼び出されたときにオブジェクト コンテキストが の値に到達することを期待します。
JavaScript のほとんどの場合 (アロー構文で定義された関数を除く)、 の値はthis
メソッドの呼び出し方法によって決まります。適切なオブジェクトでメソッドを呼び出す通常の最も一般的な方法は、次のとおりです。
obj.method()
これにより、JavaScript が呼び出されたときにが設定this
されます。obj
method()
次のようなことをすると:
var myFunction = obj.method;
そして、次のようにオブジェクト参照なしでそのメソッドを呼び出します。
var myFunction = obj.method;
myFunction();
次に、オブジェクト参照obj
が失われ、メソッドに渡されません。JavaScript インタープリターは、のデフォルト値を選択しますthis
。
厳密モードでthis
は、 に設定されundefined
、その値を使用しようとするメソッドは、オブジェクト参照であると想定して失敗します。
非厳密モードでは、ブラウザはthis
「何らかのデフォルト値」を指すように設定されます。ブラウザでは、それがwindow
オブジェクトです。そのため、window オブジェクトでメソッドを使用しようとしている場合、見よ、それはたまたま機能します。私はこれを多少の事故であり、良いコードではないと考えています。
IMO、物語の教訓は、オブジェクトに関連付けられることを期待するメソッドは、明示的なオブジェクト参照で呼び出す必要があるということです。次に、すべての混乱を取り除き、厳密モードと非厳密モードの間のすべての違いを取り除き、ブラウザーと Node.js の間のすべての違いを取り除きます。
では、なぜこれが起こるのですか:
hasOwnProperty("x")
TypeError: undefined または null をオブジェクトに変換できません
hasOwnProperty()
node.js でグローバル オブジェクトのプロパティをテストするために呼び出しようとしている場合は、次のようにglobal
オブジェクトのコンテキストでメソッドを呼び出します。
global.hasOwnProperty("a")
これはどこでも機能し、優れた適切な Javascript コードと見なされます。適切なオブジェクト コンテキストなしで呼び出すと、this
値が既定値に設定されます。node.js では、そのデフォルト値が必ずしもグローバル オブジェクトになるとは限りません。しかし、どのような場合でも、そのデフォルト値に依存するべきではありません。目的のオブジェクト参照を常に指定して正しくプログラミングすれば、コードはどこでも正常に動作します。
this
参考までに、関数に渡されるものを制御する方法は、単にobj.method()
. 他の方法については、こちらの他の回答をご覧ください。それらには.call()
、 、.apply()
、アロー関数 ( ES6の場合) などが含まれます...