$.extend

<script>
        /*$.extend([deep], target, object1, [objectN])用一个或多个其它对象来扩展一个对象target,返回被扩展的对象。
          $.extend(target,src1,src2,src3...);若未指定target,则给jq命名空间扩展
          $.extend(true,target,src1,src2,src3...)如果第一个参数设置为true,则jQuery返回一个深层次的副本,递归地复制找到的任何对象。
          $.extend(false,target,src1,src2,src3...)否则的话,副本会与原对象共享结构。 未定义的属性将不会被复制,然而从对象的原型继承的属性将会被复制。
        */
        var  obj = {};
        var obj1 = {name:"Tom",age:21};
        var obj2 = {name:"Jerry",sex:"Boy"};
        var obj3 = $.extend(obj,obj1,obj2);
        console.log(JSON.stringify(obj));//{"name":"Jerry","age":21,"sex":"Boy"}//第一个非Boolean值参数会用来接收结果
        console.log(JSON.stringify(obj1));//{"name":"Tom","age":21}//不变
        console.log(JSON.stringify(obj2));//{"name":"Jerry","sex":"Boy"}//不变
        console.log(JSON.stringify(obj3));//{"name":"Jerry","age":21,"sex":"Boy"}//obj与obj3值一致
        console.log(obj == obj3);//ture
        console.log(obj === obj3);//ture extend类似java父子类继承,子类可重写、添加新的方法与属性,传入值如果需要改变则放到target位置,否则放到target后面
        var xxx = {} ;yyy = {};
        var obj4 = $.extend(true,xxx,{name:1,age:1,location:{x:1,y:1}},{name:2,age:2,sex:2,location:{x:2,y:2,z:2}});
        console.log(JSON.stringify(obj4));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
        console.log(JSON.stringify(xxx));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
        //深拷贝模式中,如果有新的属性或者新子属性均会被拷贝过来
        var obj5 = $.extend(false,yyy,{name:1,age:1,location:{x:1,y:1}},{name:2,age:2,sex:2,location:{x:2,y:2,z:2}});
        console.log(JSON.stringify(obj5));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
        console.log(JSON.stringify(yyy));//{} //非深拷贝模式中,如果有新的属性或者新子属性均会被拷贝过来作为返回值,但dest不变
        var obj6 = {name:3};
        var obj7 = $.extend(false,obj6,{name:1,age:1,location:{x:1,y:1}},{name:2,age:2,sex:2,location:{x:2,y:2,z:2}});
        console.log("false return value:"+JSON.stringify(obj7));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
        console.log("false dest" +JSON.stringify(obj6));//{"name":3}原有属性未变,也未添加新属性
        //总结:$.extend(target, object1, [objectN])模式中,target被改变成返回值,但属于浅拷贝
        //     $.extend([deep],target, object1, [objectN])模式中,不论true/false均会返回深拷贝值,truey则target被改变,false则target不变
        //使用方法:是否需要深拷贝
        //  --是 $.extend([deep], target, object1, [objectN])==》由[deep]控制是否需要改变target
        //  --否 $.extend(target, object1, [objectN])==》是否需要改变某个值,是则直接将该值放到target位置,否则target放入{}即可

    </script>
/*$.extend([deep], target, object1, [objectN])用一个或多个其它对象来扩展一个对象target,返回被扩展的对象。
$.extend(target,src1,src2,src3...);若未指定target,则给jq命名空间扩展
$.extend(true,target,src1,src2,src3...)如果第一个参数设置为true,则jQuery返回一个深层次的副本,递归地复制找到的任何对象。
$.extend(false,target,src1,src2,src3...)否则的话,副本会与原对象共享结构。 未定义的属性将不会被复制,然而从对象的原型继承的属性将会被复制。
*/
var obj = {};
var obj1 = {name:"Tom",age:21};
var obj2 = {name:"Jerry",sex:"Boy"};
var obj3 = $.extend(obj,obj1,obj2);
console.log(JSON.stringify(obj));//{"name":"Jerry","age":21,"sex":"Boy"}//第一个非Boolean值参数会用来接收结果
console.log(JSON.stringify(obj1));//{"name":"Tom","age":21}//不变
console.log(JSON.stringify(obj2));//{"name":"Jerry","sex":"Boy"}//不变
console.log(JSON.stringify(obj3));//{"name":"Jerry","age":21,"sex":"Boy"}//objobj3值一致
console.log(obj == obj3);//ture
console.log(obj === obj3);//ture extend类似java父子类继承,子类可重写、添加新的方法与属性,传入值如果需要改变则放到target位置,否则放到target后面
var xxx = {} ;yyy = {};
var obj4 = $.extend(true,xxx,{name:1,age:1,location:{x:1,y:1}},{name:2,age:2,sex:2,location:{x:2,y:2,z:2}});
console.log(JSON.stringify(obj4));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
console.log(JSON.stringify(xxx));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
//深拷贝模式中,如果有新的属性或者新子属性均会被拷贝过来
var obj5 = $.extend(false,yyy,{name:1,age:1,location:{x:1,y:1}},{name:2,age:2,sex:2,location:{x:2,y:2,z:2}});
console.log(JSON.stringify(obj5));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
console.log(JSON.stringify(yyy));//{} //非深拷贝模式中,如果有新的属性或者新子属性均会被拷贝过来作为返回值,但dest不变
var obj6 = {name:3};
var obj7 = $.extend(false,obj6,{name:1,age:1,location:{x:1,y:1}},{name:2,age:2,sex:2,location:{x:2,y:2,z:2}});
console.log("false return value:"+JSON.stringify(obj7));//{"name":2,"age":2,"location":{"x":2,"y":2,"z":2},"sex":2}
console.log("false dest" +JSON.stringify(obj6));//{"name":3}原有属性未变,也未添加新属性
//总结:$.extend(target, object1, [objectN])模式中,target被改变成返回值,但属于浅拷贝
// $.extend([deep],target, object1, [objectN])模式中,不论true/false均会返回深拷贝值,trueytarget被改变,falsetarget不变
//使用方法:是否需要深拷贝
// -- $.extend([deep], target, object1, [objectN])==》由[deep]控制是否需要改变target
// -- $.extend(target, object1, [objectN])==》是否需要改变某个值,是则直接将该值放到target位置,否则target放入{}即可

猜你喜欢

转载自www.cnblogs.com/onlyEnglish/p/9154641.html