2009-02-27 41 views
18

私はこのように簡単だろうと思った:ネイティブ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、クローム、サファリ、オペラに、彼らはネイティブのすべてのプロパティ/メソッドを返しませんこのテストを使用してArrayオブジェクトを 'undefined'とします。

.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 
} 

プロパティ/メソッドは〜ネイティブオブジェクト/〜「JavaScriptのクラス」に存在している、またはこれを行うには良い方法があるかどうかを決定するために、この構文を使用してに何か問題はありますか?

答えて

30

まず、typeofは演算子であり、関数ではないので、かっこは必要ありません。第2に、オブジェクトのプロトタイプにアクセスします。あなたが実行すると配列のインスタンスがpushメソッドを持っていない場合はArrayオブジェクト自体は、プッシュ方式を持っている場合

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

typeof Array.pushあなたがテストしています。

+0

興味深い...私は、.prototypeはオブジェクトに新しいプロパティ/メソッドを追加するためのものであり、typeofを使用するとは思っていませんでした。例えば プロトタイプhttp://www.devguru.com/technologies/JavaScript/10764.asp typeof http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe

+0

これはそうですが、それだけではありません。 Douglas Crockford氏のプレゼンテーションをYUI Theater(http://developer.yahoo.com/yui/theater/)の "Advanced Javascript"で見てみることをお勧めします。オブジェクトプロトタイプの仕組みを含め、そこには素晴らしい "under the hood"というものがあります。 –

+1

これは親プロトタイプ –

2

And it does work fine in Firefox

これは偶然でしかない!一般に、プロトタイプのメソッドもコンストラクター関数に存在するとは期待できません。

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

これは、右のあなたは、多年生JavaScriptの落とし穴をnewを忘れ除いてほとんどでした。 new Array().push、または[].pushを短く指定すると、必要なメソッドがあるインスタンスが正しくチェックされます。

51

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

if ('property' in objectVar) 
+1

私は、 'AddFavorite'がwindow.externalに存在するかどうかをチェックする方法を探していました。これまでのところ: alert( 'window.external'のAddFavorite) ; は動作する唯一のスクリプトです! ありがとう – Elmer

+1

これは受け入れられた回答である必要があります。現在受け入れられている回答とは異なり、すべての場合に機能します。 –

8

typeofが十分慣用的でない場合.hasOwnPropertyは、アレイのproptotypeにアクセスすることができます。

 

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

良いオプション - オブジェクトが '.hasOwnProperty()'メソッドを持っているかどうかを最初に確認することなく、古いバージョンのIEのDOM要素でこれがテストされていないことを確認するだけですhttp://msdn.microsoft.com/en-私/ライブラリ/ 328kyd6z%28VS.85%29.aspx#CommunityContentHeader – scunliffe

関連する問題