您的位置:首页 > Web前端 > JavaScript

JavaScript对象复制、扩展(改变原对象的引用,避免原对象被动态的改变值);

2016-06-29 17:46 549 查看
javaScript对象在赋值时,常常直接使用”=”,觉得可以直接把一个一个对象赋值给另一个对象;

javaScript中的数据类型分为两类,原始类型和对象类型;

1.原始类型:包括数值,字符串、布尔值、null、undefined;

2.对象类型:对象即属性的集合(function、Array);

先了解数据类型在计算机中的存储;

1.原始类型:存储的是对象的原始数据;

2.对象类型:对象的原型也是引用类型,对象类型的值单独存放。对象原型的方法和属性放在内存中,通过原型链的方式来指向这个地址;所以对象类型存储的是对象的引用地址;

一、原始类型:

字符串:

var a = "a";
var b = a;
b = "b";
console.log("a:"+a);// "a"
console.log("b:"+b);// "b"


布尔类型

var a = true;
var b = a;
b = false;
console.log("a:"+a);// true
console.log("b:"+b);// false


数值

var a = 1;
var b = a;
b = 2;
console.log("a:"+a);// 1
console.log("b:"+b);// 2


重以上的离职可以看出,原始对象的复制,通过”=”的方式仍然能够获得正确的值;

二、对象类型

看代码:

var person = {
name:"z",
age:24,
child:{
name:"z-1",
age:2
}
}

var person_o = person;
person_o.child.age = 200;
console.log("person:"+person.child.age);// 200
console.log("person_o:"+person_o.child.age);// 200


对象类型在复制的时候,只是将对象的引用复制了,将person对象的引用地址值赋值给了person_o

所以在perison_o改变对象属性值的时候,person的引用也发生了改变,它们在内存中获取的都是同

一个对象;

解决方案;

JQuery中有extend()方法合并多个对象;

使用:var newSrc=$.extend({},src1,src2,src3…);很轻松的搞定;

javaScript中没有明确类的概念,我们要针对每个对象类型,写个方法,复制对象中的每个属性及方法;

/**
*  对象复制(克隆)方法,改变对原对象的引用,生成新对象
*  复制时包括对象中的属性,方法;
*  其中dataType()方法请参照方法库:[javascript常用方法整理;(不断更新)](http://blog.csdn.net/j_y_x_8/article/details/52045716)
*
*  @obj:数据
**/
function clone(obj){
var result = {},objClass=dataType(obj);
if (objClass==="Object") {
result = {};
}else if (objClass==="Array"){
result = [];
}else{
return obj;
}
// 遍历obj对象的每一个属性
for ( var key in obj ){
var = obj[key];
if (dataType(val)==="Object"){
result[key] = arguments.callee(val);
}else if(dataType(val)==="Array"){
result[key] = arguments.callee(val);
}else{
result[key] = obj[key];
}
}
return result;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 对象