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);
时间: 2024-10-13 22:06:07