JS拷贝函数(ES5)
直接上代码了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /** * 对象拷贝处理 * @param obj 要拷贝的对象 * @returns 拷贝后的对象 */ function clone(obj) { // js 基本类型 var jsTypeList = [Boolean, Number, String, Date, RegExp]; // 构造函数列表 var constructorList = {} // this对象保存 var self = this; // 向构造函数列表中添加对应函数 for (var i = 0; i < jsTypeList.length; i++) { constructorList[jsTypeList[i]] = function(obj) { // 基本类型拷贝 return new jsTypeList[i](obj) } } // 对象类型拷贝处理 constructorList[Object] = function(obj) { var clonedObject = new (obj.constructor); for (var attr in obj) { clonedObject[attr] = typeof obj[attr] == "object" ? constructorList[Object](obj[attr]) : obj[attr]; } return clonedObject; } // 数组类型拷贝处理 constructorList[Array] = function (obj) { var clonedArray = []; for (var i = 0; i < obj.length; i++) { clonedArray[i] = typeof obj[i] == "object" ? constructorList[Object](obj[i]): obj[i]; } return clonedArray; } // 向构造函数列表中添加对象,数组 jsTypeList.push(Object, Array); // 克隆处理 for (var i = 0; i < jsTypeList.length; i++) { if (obj instanceof jsTypeList[i]) { return constructorList[jsTypeList[i]](obj); } } return obj; } // 测试对象 var person = { name: "tom", age: 32, detailInfo: {hobby: ["music", "movie", "badminton"]} } console(clone(person)); console(clone(person) == person); console(clone(person).detailInfo == person.detailInfo); |