私の開発作業では、関数がJavaScriptネイティブ関数であるかどうかを判断する必要がある状況に遭遇することがよくあります。時々これは非常に必要な作業です。この関数がブラウザ自体によって提供されているのか、それともカプセル化され、第三者によってネイティブ関数として偽装されているのかを知る必要があります。もちろん、最良の方法は、この関数を実行するToStringメソッドの返品値を調べることです。
JavaScript
このタスクを達成する方法は非常に簡単です:
コードコピーは次のとおりです。
関数isNative(fn){
return(// {/s*/[ネイティブコード/]/s*/}/)。test( '' + fn);
}
ToStringメソッドは、この方法の文字列形式を返し、正規表現を使用して、その中に含まれる文字を決定します。
より強い方法
Lodashの創設者であるJohn-David Daltonは、より良い解決策を見つけました。
コードコピーは次のとおりです。
;(関数() {
//値の内部「[class]] `を解決するために使用されます
var toString = object.prototype.toString;
//分解された関数のソースを解決するために使用されます
var fntostring = function.prototype.tostring;
//ホストコンストラクターを検出するために使用されます(Safari> 4;本当に入力された配列固有)
var rehostctor =/^/[object。+?constructor/] $/;
//テンプレートとして一般的なネイティブメソッドを使用してRegexpをコンパイルします。
//「オブジェクト#toString」を選択します。
var renative = regexp( '^' +
//文字列に `オブジェクト#toString`をcorerceします
文字列(ToString)
//特別なregexp文字をエスケープします
.replace(/[。*+?^$ {}()| [/] /////]/g、 '// $&')
//「toString」の言及を `。*?`に置き換えます。
// `for ...`のようなものを交換します。
//メソッドアリティなど。
.replace(/toString |(function)。*?(?= ///()| for。 +?(?= ///])/g、 '$ 1.*?')
);
関数isNative(価値){
var type = typeof値;
return type == 'function'
// `function#toString`を使用して、値の独自の` toString`メソッドをバイパスします
//偽造されないでください。
? renative.test(fntostring.call(value))
//一部の環境が表現するため、ホストオブジェクトチェックへのフォールバック
// domメソッドとして型付けられた配列のようなものは、に準拠しない可能性があります
//通常のネイティブパターン。
:( value && type == 'object' && rehostctor.test(toString.call(value)))||間違い;
}
//必要な場合はエクスポートします
module.exports = isnative;
}());
今、あなたもそれを見ています、それは非常に複雑ですが、より強力です。もちろん、これはセキュリティ保護のためではなく、ネイティブ機能であるかどうかに関する関連情報を提供するだけです。