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

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;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值