JavaScriptで原生関数を判断し、functionが原生コードかどうかを確認します.

2352 ワード

私はいつもあるfunctionが元のコードかどうかをチェックする必要があります.これは機能テストの中の重要な内容です.関数はブラウザに内蔵されているのですか?それとも第三者のクラスを通してシミュレーションされていますか?この点を検出する一番簡単な方法はもちろん関数のtoStringメソッドの戻り値を判断することです.
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