1 | /**
|
2 | * lodash 3.9.1 (Custom Build) <https://lodash.com/>
|
3 | * Build: `lodash modern modularize exports="npm" -o ./`
|
4 | * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
|
5 | * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
6 | * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
7 | * Available under MIT license <https://lodash.com/license>
|
8 | */
|
9 |
|
10 | /** `Object#toString` result references. */
|
11 | var funcTag = '[object Function]';
|
12 |
|
13 | /** Used to detect host constructors (Safari > 5). */
|
14 | var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
15 |
|
16 | /**
|
17 | * Checks if `value` is object-like.
|
18 | *
|
19 | * @private
|
20 | * @param {*} value The value to check.
|
21 | * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
22 | */
|
23 | function isObjectLike(value) {
|
24 | return !!value && typeof value == 'object';
|
25 | }
|
26 |
|
27 | /** Used for native method references. */
|
28 | var objectProto = Object.prototype;
|
29 |
|
30 | /** Used to resolve the decompiled source of functions. */
|
31 | var fnToString = Function.prototype.toString;
|
32 |
|
33 | /** Used to check objects for own properties. */
|
34 | var hasOwnProperty = objectProto.hasOwnProperty;
|
35 |
|
36 | /**
|
37 | * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
|
38 | * of values.
|
39 | */
|
40 | var objToString = objectProto.toString;
|
41 |
|
42 | /** Used to detect if a method is native. */
|
43 | var reIsNative = RegExp('^' +
|
44 | fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
|
45 | .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
46 | );
|
47 |
|
48 | /**
|
49 | * Gets the native function at `key` of `object`.
|
50 | *
|
51 | * @private
|
52 | * @param {Object} object The object to query.
|
53 | * @param {string} key The key of the method to get.
|
54 | * @returns {*} Returns the function if it's native, else `undefined`.
|
55 | */
|
56 | function getNative(object, key) {
|
57 | var value = object == null ? undefined : object[key];
|
58 | return isNative(value) ? value : undefined;
|
59 | }
|
60 |
|
61 | /**
|
62 | * Checks if `value` is classified as a `Function` object.
|
63 | *
|
64 | * @static
|
65 | * @memberOf _
|
66 | * @category Lang
|
67 | * @param {*} value The value to check.
|
68 | * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
|
69 | * @example
|
70 | *
|
71 | * _.isFunction(_);
|
72 | * // => true
|
73 | *
|
74 | * _.isFunction(/abc/);
|
75 | * // => false
|
76 | */
|
77 | function isFunction(value) {
|
78 | // The use of `Object#toString` avoids issues with the `typeof` operator
|
79 | // in older versions of Chrome and Safari which return 'function' for regexes
|
80 | // and Safari 8 equivalents which return 'object' for typed array constructors.
|
81 | return isObject(value) && objToString.call(value) == funcTag;
|
82 | }
|
83 |
|
84 | /**
|
85 | * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
|
86 | * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
87 | *
|
88 | * @static
|
89 | * @memberOf _
|
90 | * @category Lang
|
91 | * @param {*} value The value to check.
|
92 | * @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
93 | * @example
|
94 | *
|
95 | * _.isObject({});
|
96 | * // => true
|
97 | *
|
98 | * _.isObject([1, 2, 3]);
|
99 | * // => true
|
100 | *
|
101 | * _.isObject(1);
|
102 | * // => false
|
103 | */
|
104 | function isObject(value) {
|
105 | // Avoid a V8 JIT bug in Chrome 19-20.
|
106 | // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
|
107 | var type = typeof value;
|
108 | return !!value && (type == 'object' || type == 'function');
|
109 | }
|
110 |
|
111 | /**
|
112 | * Checks if `value` is a native function.
|
113 | *
|
114 | * @static
|
115 | * @memberOf _
|
116 | * @category Lang
|
117 | * @param {*} value The value to check.
|
118 | * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
|
119 | * @example
|
120 | *
|
121 | * _.isNative(Array.prototype.push);
|
122 | * // => true
|
123 | *
|
124 | * _.isNative(_);
|
125 | * // => false
|
126 | */
|
127 | function isNative(value) {
|
128 | if (value == null) {
|
129 | return false;
|
130 | }
|
131 | if (isFunction(value)) {
|
132 | return reIsNative.test(fnToString.call(value));
|
133 | }
|
134 | return isObjectLike(value) && reIsHostCtor.test(value);
|
135 | }
|
136 |
|
137 | module.exports = getNative;
|