10
10
* Port of jQuery.extend that actually works on node.js
11
11
*/
12
12
var is = require ( 'is' ) ;
13
+ var has = require ( 'has' ) ;
14
+
15
+ var defineProperty = Object . defineProperty ;
16
+ var gOPD = Object . getOwnPropertyDescriptor ;
17
+
18
+ // If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target
19
+ var setProperty = function setP ( target , name , value ) {
20
+ if ( defineProperty && name === '__proto__' ) {
21
+ defineProperty ( target , name , {
22
+ enumerable : true ,
23
+ configurable : true ,
24
+ value : value ,
25
+ writable : true
26
+ } ) ;
27
+ } else {
28
+ target [ name ] = value ;
29
+ }
30
+ } ;
31
+
32
+ // Return undefined instead of __proto__ if '__proto__' is not an own property
33
+ var getProperty = function getP ( obj , name ) {
34
+ if ( name === '__proto__' ) {
35
+ if ( ! has ( obj , name ) ) {
36
+ return void 0 ;
37
+ } else if ( gOPD ) {
38
+ // In early versions of node, obj['__proto__'] is buggy when obj has
39
+ // __proto__ as an own property. Object.getOwnPropertyDescriptor() works.
40
+ return gOPD ( obj , name ) . value ;
41
+ }
42
+ }
43
+
44
+ return obj [ name ] ;
45
+ } ;
13
46
14
47
// eslint-disable-next-line func-style
15
48
function extend ( ) {
@@ -41,8 +74,8 @@ function extend() {
41
74
}
42
75
// Extend the base object
43
76
for ( name in options ) {
44
- src = target [ name ] ;
45
- copy = options [ name ] ;
77
+ src = getProperty ( target , name ) ;
78
+ copy = getProperty ( options , name ) ;
46
79
47
80
// Prevent never-ending loop
48
81
if ( target === copy ) {
@@ -59,11 +92,11 @@ function extend() {
59
92
}
60
93
61
94
// Never move original objects, clone them
62
- target [ name ] = extend ( deep , clone , copy ) ;
95
+ setProperty ( target , name , extend ( deep , clone , copy ) ) ;
63
96
64
97
// Don't bring in undefined values
65
98
} else if ( typeof copy !== 'undefined' ) {
66
- target [ name ] = copy ;
99
+ setProperty ( target , name , copy ) ;
67
100
}
68
101
}
69
102
}
0 commit comments