web-dev-qa-db-ja.com

ネイティブJavaScriptオブジェクトにプロパティ/メソッドがあるかどうかを判断する方法は?

これは次のように簡単だと思いました。

if(typeof(Array.Push) == 'undefined'){
  //not defined, prototype a version of the Push method
  // Firefox never gets here, but IE/Safari/Chrome/etc. do, even though
  // the Array object has a Push method!
}

そして、Firefoxでは正常に動作しますしかしIE、Chrome、Safari、Operaでは機能しません。すべてのプロパティ/メソッドを返しますこのテストを使用して、ネイティブのArrayオブジェクトの「未定義」として。

.hasOwnProperty(prop)メソッドはインスタンスでのみ機能します...そのため機能しませんが、試行錯誤により、これが機能することに気付きました。

//this works in Firefox/IE(6,7,8)/Chrome/Safari/Opera
if(typeof(Array().Push) == 'undefined'){
  //not defined, prototype a version of the Push method
}

この構文を使用してプロパティ/メソッドがNative Object /〜 "JavaScript Class"〜に存在するかどうか、またはこれを行うためのより良い方法?

22
scunliffe

まず、typeofは関数ではなく演算子なので、括弧は必要ありません。次に、オブジェクトのプロトタイプにアクセスします。

alert( typeof Array.prototype.Push );
alert( typeof Array.prototype.foo );

typeof Array.Pushを実行すると、Arrayオブジェクト自体にPushメソッドがあるかどうかがテストされます。ArrayのインスタンスにPushメソッドがあるかどうかではありません。

32
Peter Bailey

プロパティが存在するかどうかを確認する適切な方法:

if ('property' in objectVar)
57
Barney

.hasOwnPropertyはArrayプロトタイプでアクセスできます。typeofは慣用的ではありません。


if (Array.prototype.hasOwnProperty('Push')) {
    // Native array has Push property
}
8
ryan v

そしてそれはFirefoxでうまく機能します

それは偶然によるだけです!通常、プロトタイプのメソッドがコンストラクター関数にも存在することは期待できません。

_if(typeof(Array().Push) == 'undefined')
_

これは、永続的なJavaScriptの落とし穴であるnewを忘れた場合を除いて、ほとんど問題ありませんでした。 new Array().Push、または略して_[].Push_は、必要なメソッドがあるインスタンスを正しくチェックします。

3
bobince