24

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

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"~に存在するかどうかを判断するためにこの構文を使用することに何か問題がありますか、またはこれを行うためのより良い方法はありますか?

4

4 に答える 4

60

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

if ('property' in objectVar)
于 2010-03-21T20:00:41.573 に答える
34

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

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

実行するときtypeof Array.pushは、Arrayのインスタンスにpushメソッドがあるかどうかではなく、Arrayオブジェクト自体にpushメソッドがあるかどうかをテストしています。

于 2009-02-27T17:41:08.247 に答える
8

十分に慣用的でない場合は、配列の.hasOwnPropertyproptotype でアクセスできます。typeof


if (Array.prototype.hasOwnProperty('push')) {
    // Native array has push property
}

于 2010-04-19T22:14:26.253 に答える
3

そして、それはFirefoxでうまく動作します

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

if(typeof(Array().push) == 'undefined')

これはほぼ正しかったのですがnew、JavaScript の長年の落とし穴である を忘れていました。new Array().push、または[].push略して、インスタンスが必要なメソッドを持っていることを正しくチェックします。

于 2009-02-27T17:54:26.017 に答える