ブラウザーの傾向は、古いオブジェクトに新しいメソッドを追加しながら、ワーカーなどのオブジェクトをどんどん追加することです。互換性を持たせるための最初のステップは、それらが存在するかどうかを検出することです。存在しない場合は、独自の互換性コードを追加します。この時点で問題が発生します。一部のクラス ライブラリはこの手順を実行しますが、実行しない場合もありますが、標準を満たしていません。したがって、単に typeof Array.prototype.map === "function" だけでは十分ではない可能性があります。このとき、isNativeメソッドが表示されます。
私が使用している、自分で書いたバージョン:
var isNative = function(method){//ネイティブ メソッドかどうかを判断します
return !! method && (/{s*[ネイティブ コード]s*}/.test(method "") ) ||
/ {s*/* ソースコードは利用できません */s*}/.test(method ""));//これは opera9.x との互換性のためです
}
しかし、世界はこのようなものです、私はこの問題を勉強したに違いありません。次は、Safari のネイティブ メソッドの toString 値が実際には非社交的であることを指摘した Diego Perini のバージョンです:
var isNative = function(object, method) {
return object && object in object &&
typeof object[method] != string &&
// IE および W3C ブラウザは "[ネイティブ コード]" を返します
// Safari < = 2.0.4 は "[関数]" を返します
(/{s*[ネイティブ コード]s* }|^[関数]$/).test(オブジェクト[メソッド]);
}
パラメータが 1 つ多くありますversion はネイティブ オブジェクトのメソッドを指定できますが、1 つのパラメーターか 2 つのパラメーターは重要ではありません。結果は、完成にはまだ距離があることを示しています。これら 2 つの関数の和集合が取られたとしても、それは正しい完全なセットではない可能性があります。
もちろん、これは [ネイティブ コード] やソース コードが利用できない、または [関数] の問題ではありません。JavaScript ではさまざまなメソッドやオブジェクトを簡単にコピーできるからです。たとえば、次のコードは検出コードをうまく騙すことができます。
window.test = {
toString : function( ) {
return [function];
}
};
isNative(window, test) // true
ついに nwmathers からこれを見つけました:
var isNative = (function() {
var s = (window.open ).replace(/open/g, );
return function(オブジェクト, メソッド) {
var m = オブジェクト オブジェクト[メソッド] : false, r = new RegExp(メソッド, g );
return !!(m && typeof m != string && s === (m ).replace(r, ));