检测一个函数是否是JavaScript原生函数的小技巧
在我的开发工作中经常会遇到需要判断一个函数是否是JavaScript原生函数的情况,有时候这是一个很必要的工作,你需要知道这个函数是浏览器自身提供的,还是由第三方封装、伪装成原生函数。当然,最好的方法是考察执行这个函数的toString方法的返回值。
TheJavaScript
完成这个任务的方法非常简单:
functionisNative(fn){ return(/\{\s*\[nativecode\]\s*\}/).test(''+fn); }
toString方法会返回这个方法的字符串形式,然后用正则表达式判断里面包含的字符。
更强悍的方法
Lodash的创始人John-DavidDalton找到了一个更佳的方案:
;(function(){
//Usedtoresolvetheinternal`[[Class]]`ofvalues vartoString=Object.prototype.toString; //Usedtoresolvethedecompiledsourceoffunctions varfnToString=Function.prototype.toString; //Usedtodetecthostconstructors(Safari>4;reallytypedarrayspecific) varreHostCtor=/^\[object.+?Constructor\]$/;
//Compilearegexpusingacommonnativemethodasatemplate. //Wechose`Object#toString`becausethere'sagoodchanceitisnotbeingmuckedwith. varreNative=RegExp('^'+ //Coerce`Object#toString`toastring String(toString) //Escapeanyspecialregexpcharacters .replace(/[.*+?^${}()|[\]\/\\]/g,'\\$&') //Replacementionsof`toString`with`.*?`tokeepthetemplategeneric. //Replacethinglike`for...`tosupportenvironmentslikeRhinowhichaddextrainfo //suchasmethodarity. .replace(/toString|(function).*?(?=\\\()|for.+?(?=\\\])/g,'$1.*?')+'$' ); functionisNative(value){ vartype=typeofvalue; returntype=='function' //Use`Function#toString`tobypassthevalue'sown`toString`method //andavoidbeingfakedout. ?reNative.test(fnToString.call(value)) //Fallbacktoahostobjectcheckbecausesomeenvironmentswillrepresent //thingsliketypedarraysasDOMmethodswhichmaynotconformtothe //normalnativepattern. :(value&&type=='object'&&reHostCtor.test(toString.call(value)))||false; } //exporthoweveryouwant module.exports=isNative; }());