JSがネイティブメソッドかどうかを判断する_JavaScriptスキル

WBOY
リリース: 2016-05-16 17:28:02
オリジナル
1175 人が閲覧しました

ブラウザーの傾向は、古いオブジェクトに新しいメソッドを追加しながら、ワーカーなどのオブジェクトをどんどん追加することです。互換性を持たせるための最初のステップは、それらが存在するかどうかを検出することです。存在しない場合は、独自の互換性コードを追加します。この時点で問題が発生します。一部のクラス ライブラリはこの手順を実行しますが、実行しない場合もありますが、標準を満たしていません。したがって、単に 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, ));

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート