これは次のように簡単だと思いました。
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"〜に存在するかどうか、またはこれを行うためのより良い方法?
まず、typeofは関数ではなく演算子なので、括弧は必要ありません。次に、オブジェクトのプロトタイプにアクセスします。
alert( typeof Array.prototype.Push );
alert( typeof Array.prototype.foo );
typeof Array.Push
を実行すると、Arrayオブジェクト自体にPushメソッドがあるかどうかがテストされます。ArrayのインスタンスにPushメソッドがあるかどうかではありません。
プロパティが存在するかどうかを確認する適切な方法:
if ('property' in objectVar)
.hasOwnProperty
はArrayプロトタイプでアクセスできます。typeof
は慣用的ではありません。
if (Array.prototype.hasOwnProperty('Push')) {
// Native array has Push property
}
そしてそれはFirefoxでうまく機能します
それは偶然によるだけです!通常、プロトタイプのメソッドがコンストラクター関数にも存在することは期待できません。
_if(typeof(Array().Push) == 'undefined')
_
これは、永続的なJavaScriptの落とし穴であるnew
を忘れた場合を除いて、ほとんど問題ありませんでした。 new Array().Push
、または略して_[].Push
_は、必要なメソッドがあるインスタンスを正しくチェックします。