JavaScript: isNative

Published on Author craigzearfossLeave a comment
Determines if a JavaScript function is native to a browser.

    isNative(alert); // true
    isNative(myCustomFunction); // false


(function() {

 // Used to resolve the internal `[[Class]]` of values
 var toString = Object.prototype.toString;
 // Used to resolve the decompiled source of functions
 var fnToString = Function.prototype.toString;
 // Used to detect host constructors (Safari > 4; really typed array specific)
 var reHostCtor = /^\[object .+?Constructor\]$/;

 // Compile a regexp using a common native method as a template.
 // We chose `Object#toString` because there's a good chance it is not being mucked with.
 var reNative = RegExp('^' +
    // Coerce `Object#toString` to a string
    // Escape any special regexp characters
    .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')
    // Replace mentions of `toString` with `.*?` to keep the template generic.
    // Replace thing like `for ...` to support environments like Rhino which add extra info
    // such as method arity.
    .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
 function isNative(value) {
    var type = typeof value;
    return type == 'function'
     // Use `Function#toString` to bypass the value's own `toString` method
     // and avoid being faked out.
     ? reNative.test(
     // Fallback to a host object check because some environments will represent
     // things like typed arrays as DOM methods which may not conform to the
     // normal native pattern.
     : (value && type == 'object' && reHostCtor.test( || false;
 // export however you want
 module.exports = isNative;

Leave a Reply

Your email address will not be published. Required fields are marked *