JavaScriptで原生関数を判断する二つの例
2434 ワード
原文のリンク: Detect if a Function is Native Code with JavaScript
原文の日付:2014-08-17
翻訳日:2014-08-20
通訳:アンカー
私はいつもあるfunctionが元のコードかどうかを確認する必要があります. —— これは機能テストの中で重要な内容です.関数はブラウザ内蔵のサポートですか?それとも第三者のクラスを通して模擬しますか?この点を検出するには、最も簡単な方法はもちろん関数を判断することです.
toStringメソッドの戻り値とか.
JavaScriptコード
関数が原生かどうかを判断する方法はかなり簡単です.
アップグレード版、Update
Lodashの著者John-David Daltonは、より良い処理方法を共有しています.
原文の日付:2014-08-17
翻訳日:2014-08-20
通訳:アンカー
私はいつもあるfunctionが元のコードかどうかを確認する必要があります. —— これは機能テストの中で重要な内容です.関数はブラウザ内蔵のサポートですか?それとも第三者のクラスを通して模擬しますか?この点を検出するには、最も簡単な方法はもちろん関数を判断することです.
toStringメソッドの戻り値とか.
JavaScriptコード
関数が原生かどうかを判断する方法はかなり簡単です.
//
function isNative(fn) {
// :
// alert.toString()
// "function alert() { [native code] }"
// '' + fn js .
return (/\{\s*\[native code\]\s*\}/).test('' + fn);
}
関数を文字列表現の形式に変換し、正規マッチングを実行することが実現の原理です.アップグレード版、Update
Lodashの著者John-David Daltonは、より良い処理方法を共有しています.
;(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