可以参考知乎:https://www.zhihu.com/question/23031215
基本总结如下:深拷贝主要针对的是对象以及数组这两种复杂的对象。
/** * 扩展对象,增加属性和方法 * @私有 * @参数 {Boolean} deep If true, do a deep (or recursive) merge [optional] 深拷贝还是浅拷贝 * @参数 {Object} objects The objects to merge together * @返回 {Object} Merged values of defaults and options */ var extend = function () { // 变量 var extended = {}; var deep = false; var i = 0; var length = arguments.length; // Check if a deep merge if ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) { deep = arguments[0]; i++; } // Merge the object into the extended object var merge = function (obj) { for ( var prop in obj ) { if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) { // If deep merge and property is an object, merge properties // 这里并没有考虑对数组的深拷贝 至于方法这个对象按正常的方式考虑即可。 if ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) { // 考虑到extended[prop] 本身不为空,如此合并需要考虑之前的内容。【细节啊!!!】 extended[prop] = extend( true, extended[prop], obj[prop] ); } else { extended[prop] = obj[prop]; } } } }; // Loop through each object and conduct a merge for ( ; i < length; i++ ) { var obj = arguments[i]; merge(obj); } return extended; };
可以着手这个函数学习研究一下