由于对象和数组属于引用类型,所以在给对象赋值时,通常不能使用“=”进行赋值,实质上它们指向了同一个引用地址,如下:
var testParams = {
name: 'hh',
childParam: {
name: '666',
age: '20'
},
myArr: [1,2,3,4]
}
var bigParamsCopy = bigParams;
console.log(bigParamsCopy)
console.log(bigParams);
运行结果如图,原对象bigParams的值也改变了
主要函数实现
//obj为传入的需要拷贝的对象
function deepCopy(obj) {
var newObj = {};
//使用for in遍历对象
for (k in obj) {
//判断对象属性是否为Object或者Array
if (typeof obj[k] == 'object') {
//递归调用方法返回拷贝对象
newObj[k] = deepCopy(obj[k]);
} else {
newObj[k] = obj[k];
}
}
return newObj;
}
//example
var testParams = {
name: 'hh',
childParam: {
name: '666',
age: '20'
},
myArr: [1,2,3,4]
}
var myParams = deepCopy(testParams);//改变myParams中的数组不会改变testParams中的值
myParams.myArr = ['a', 'b', 'c'];
console.log(myParams.myArr) //['a', 'b', 'c']
console.log(testParams.myArr); //[1,2,3,4]
将方法绑定到原型上
给Function对象定义一个method
Function.prototype.method = function (name, func) {
// body...
if (!this.prototype[name]) {
this.prototype[name] = func;
}
return this;
}
给Object定义方法
Object.method('deepCopy', function() {
var newObj = {};
for (k in this) {
console.log(typeof this[k])
if (typeof this[k] == 'object') {
console.log(this[k])
newObj[k] = deepCopy(this[k]);
} else {
newObj[k] = this[k];
//return obj[k];
}
}
return newObj;
})
调用方式
var bigParams4 = bigParams.deepCopy();