1- import { isObject } from './private/is'
1+ const
2+ toString = Object . prototype . toString ,
3+ hasOwn = Object . prototype . hasOwnProperty ,
4+ class2type = { }
5+
6+ 'Boolean Number String Function Array Date RegExp Object' . split ( ' ' ) . forEach ( name => {
7+ class2type [ '[object ' + name + ']' ] = name . toLowerCase ( )
8+ } )
9+
10+ function type ( obj ) {
11+ return obj === null ? String ( obj ) : class2type [ toString . call ( obj ) ] || 'object'
12+ }
13+
14+ function isPlainObject ( obj ) {
15+ if ( ! obj || type ( obj ) !== 'object' ) {
16+ return false
17+ }
18+
19+ if ( obj . constructor
20+ && ! hasOwn . call ( obj , 'constructor' )
21+ && ! hasOwn . call ( obj . constructor . prototype , 'isPrototypeOf' ) ) {
22+ return false
23+ }
24+
25+ let key
26+ for ( key in obj ) { } // eslint-disable-line
27+
28+ return key === void 0 || hasOwn . call ( obj , key )
29+ }
230
331export default function extend ( ) {
432 let
@@ -14,7 +42,7 @@ export default function extend () {
1442 i = 2
1543 }
1644
17- if ( Object ( target ) !== target && typeof target !== 'function' ) {
45+ if ( Object ( target ) !== target && type ( target ) !== 'function' ) {
1846 target = { }
1947 }
2048
@@ -33,13 +61,13 @@ export default function extend () {
3361 continue
3462 }
3563
36- if ( deep && copy && ( isObject ( copy ) === true || ( copyIsArray = Array . isArray ( copy ) === true ) ) ) {
64+ if ( deep && copy && ( isPlainObject ( copy ) || ( copyIsArray = type ( copy ) === 'array' ) ) ) {
3765 if ( copyIsArray ) {
3866 copyIsArray = false
39- clone = src && Array . isArray ( src ) === true ? src : [ ]
67+ clone = src && type ( src ) === 'array' ? src : [ ]
4068 }
4169 else {
42- clone = src && isObject ( src ) === true ? src : { }
70+ clone = src && isPlainObject ( src ) ? src : { }
4371 }
4472
4573 target [ name ] = extend ( deep , clone , copy )
0 commit comments