Permalink
June 24, 2020 14:33
June 24, 2020 14:33
July 27, 2021 22:26
June 24, 2020 14:33
Newer
100644
72 lines (64 sloc)
1.9 KB
Ignoring revisions in .git-blame-ignore-revs.
1
module.exports = extend;
2
3
/*
4
var obj = {a: 3, b: 5};
5
extend(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}
6
obj; // {a: 4, b: 5, c: 8}
7
8
var obj = {a: 3, b: 5};
9
extend({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}
10
obj; // {a: 3, b: 5}
11
12
var arr = [1, 2, 3];
13
var obj = {a: 3, b: 5};
14
extend(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}
15
arr.push(4);
16
obj; // {a: 3, b: 5, c: [1, 2, 3, 4]}
17
18
var arr = [1, 2, 3];
19
var obj = {a: 3, b: 5};
20
extend(true, obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}
21
arr.push(4);
22
obj; // {a: 3, b: 5, c: [1, 2, 3]}
23
24
extend({a: 4, b: 5}); // {a: 4, b: 5}
25
extend({a: 4, b: 5}, 3); {a: 4, b: 5}
26
extend({a: 4, b: 5}, true); {a: 4, b: 5}
27
extend('hello', {a: 4, b: 5}); // throws
28
extend(3, {a: 4, b: 5}); // throws
29
*/
30
31
function extend(/* [deep], obj1, obj2, [objn] */) {
32
var args = [].slice.call(arguments);
33
var deep = false;
34
if (typeof args[0] == 'boolean') {
35
deep = args.shift();
36
}
37
var result = args[0];
38
if (isUnextendable(result)) {
39
throw new Error('extendee must be an object');
40
}
41
var extenders = args.slice(1);
42
var len = extenders.length;
43
for (var i = 0; i < len; i++) {
44
var extender = extenders[i];
45
for (var key in extender) {
47
var value = extender[key];
48
if (deep && isCloneable(value)) {
49
var base = Array.isArray(value) ? [] : {};
50
result[key] = extend(
51
true,
52
Object.prototype.hasOwnProperty.call(result, key) && !isUnextendable(result[key])
53
? result[key]
54
: base,
55
value
56
);
57
} else {
58
result[key] = value;
59
}
60
}
61
}
62
}
63
return result;
64
}
65
66
function isCloneable(obj) {
67
return Array.isArray(obj) || {}.toString.call(obj) == '[object Object]';
68
}
69
70
function isUnextendable(val) {
71
return !val || (typeof val != 'object' && typeof val != 'function');
72
}