JavaScriptで原生関数を判断する二つの例


原文のリンク:  Detect if a Function is Native Code with JavaScript
原文の日付: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