JavaScriptで原生関数を判断し、functionが原生コードかどうかを確認します.
2352 ワード
私はいつもあるfunctionが元のコードかどうかをチェックする必要があります.これは機能テストの中の重要な内容です.関数はブラウザに内蔵されているのですか?それとも第三者のクラスを通してシミュレーションされていますか?この点を検出する一番簡単な方法はもちろん関数のtoStringメソッドの戻り値を判断することです.
JavaScriptコード
関数が原生かどうかを判断する方法はかなり簡単です.
アップグレード版、Update
JavaScriptコード
関数が原生かどうかを判断する方法はかなり簡単です.
//
function isNative(fn) {
// :
// alert.toString()
// "function alert() { [native code] }"
// '' + fn js .
return (/\{\s*\[native code\]\s*\}/).test('' + fn);
}
関数を文字列表現の形式に変換し、正規マッチングを実行することが実現の原理です.アップグレード版、Update
;(function() {
// Object toString , value (internal) `[[Class]]`
var toString = Object.prototype.toString;
// Function toString , functions
var fnToString = Function.prototype.toString;
// (host constructors),
// (Safari > 4; ,really typed array specific)
var reHostCtor = /^\[object .+?Constructor\]$/;
// RegExp native .
// `Object#toString`
var reNative = RegExp('^' +
// `Object#toString`
String(toString)
//
.replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')
// , `toString` `.*?`
// `for ...` , Rhino , , .
.replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?')
//
+ '$'
);
function isNative(value) {
// typeof
var type = typeof value;
return type == 'function'
// `Function#toString` ,
// value `toString` ,
// .
? reNative.test(fnToString.call(value))
// type 'function',
// (host object) ,
// ( ) typed arrays DOM
// Native
: (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;
};
// isNative /
window.isNative = isNative;
}());
テストコード:
isNative(isNative) //false
isNative(alert) //true
window.isNative(window.isNative) //false
window.isNative(window.alert) //true
window.isNative(String.toString) //true