1 var isFunction = require('./isFunction'),
2 isHostObject = require('./_isHostObject'),
3 isObjectLike = require('./isObjectLike');
5 /** Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns). */
6 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
8 /** Used to detect host constructors (Safari > 5). */
9 var reIsHostCtor = /^\[object .+?Constructor\]$/;
11 /** Used for built-in method references. */
12 var objectProto = Object.prototype;
14 /** Used to resolve the decompiled source of functions. */
15 var funcToString = Function.prototype.toString;
17 /** Used to check objects for own properties. */
18 var hasOwnProperty = objectProto.hasOwnProperty;
20 /** Used to detect if a method is native. */
21 var reIsNative = RegExp('^' +
22 funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
23 .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
27 * Checks if `value` is a native function.
32 * @param {*} value The value to check.
33 * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
36 * _.isNative(Array.prototype.push);
42 function isNative(value) {
46 if (isFunction(value)) {
47 return reIsNative.test(funcToString.call(value));
49 return isObjectLike(value) &&
50 (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
53 module.exports = isNative;