js对象深潜拷贝(从requirejs中抠出来的)

JS对象混合与深拷贝
本文介绍了一个简单的JavaScript函数,用于将一个对象的属性混合到另一个对象中,并支持深拷贝递归操作,确保了目标对象不会受到源对象变化的影响。
 1 var op = Object.prototype,
 2     ostring = op.toString,
 3     hasOwn = op.hasOwnProperty;
 4 
 5 function isFunction(it) {
 6     return ostring.call(it) === '[object Function]';
 7 };
 8 
 9 function isArray(it) {
10     return ostring.call(it) === '[object Array]';
11 };
12 function hasProp(obj, prop) {
13     return hasOwn.call(obj, prop);
14 };
15 function eachProp(obj, func) {
16     var prop;
17     for (prop in obj) {
18         if (hasProp(obj, prop)) {
19             if (func(obj[prop], prop)) {
20                 break;
21             }
22         }
23     }
24 };
25 /**
26  * Simple function to mix in properties from source into target,
27  * but only if target does not already have a property of the same name.
28  *
29  * @param {target} 目标对象
30  * @param {source} 源对象
31  * @param {force} 是否强制覆盖目标对象已有的属性
32  * @param {deepStringMixin} 是否深拷贝递归操作
33  *
34  * @returns {target}
35  */
36 function mixin(target, source, force, deepStringMixin) {
37     if (source) {
38         eachProp(source, function (value, prop) {
39             if (force || !hasProp(target, prop)) {
40                 if (deepStringMixin && typeof value === 'object' && value &&
41                     !isArray(value) && !isFunction(value) &&
42                     !(value instanceof RegExp)) {
43 
44                     if (!target[prop]) {
45                         target[prop] = {};
46                     }
47                     mixin(target[prop], value, force, deepStringMixin);
48                 } else {
49                     target[prop] = value;
50                 }
51             }
52         });
53     }
54     return target;
55 };
56 
57 
58 调用:
59 var obj = {
60     name:'Tom',
61     age:19,
62     children:{
63         name:'Jack',
64         age:30
65     }
66 };
67 var obj2 = mixin({},obj,false,true);
68 obj.children.name='Marry';
69 console.log(obj2);

 

转载于:https://www.cnblogs.com/gongshunkai/p/5832920.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值