码迷,mamicode.com
首页 > Web开发 > 详细

小tips:JS之浅拷贝与深拷贝

时间:2017-09-12 16:53:34      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:return   函数   深拷贝   ceo   面向   blank   tip   ons   www.   

浅拷贝:

function extendCopy(p) {
 var c = {};
 for (var i in p) {
   c[i] = p[i];
 }
 return c;
}

深拷贝:

function deepCopy(p, c) {
  var c = c || {};
  for (var i in p) {
    if (typeof p[i] === ‘object‘) {
      c[i] = (p[i].constructor === Array) ? [] : {};
      deepCopy(p[i], c[i]);
    } else {  
            c[i] = p[i];
    }
  }

  return c;
}

浅拷贝的问题:如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。

下面来个实例:

var obj1 = {
    name:‘helloJack‘,
    inner:{
        sum:5
    }
};

var obj2 = extendCopy(obj1,{});

obj2.name ="sss";
obj2.inner.sum = 7;
console.log(obj1.name); //helloJack
console.log(obj1.inner.sum); //5

存在的问题,如果经常改写这个函数的方法extendCopy,内部再调用这个方法名就会出错,还得修改一下这个方法名,那么下面这样解决:

var extendCopy = (function f(p,c){
    var c = c || {};
    for (var i in p) {
        if(typeof p[i] === ‘object‘){
            c[i] = (p[i] instanceof Array) ? [] : {};
            f(p[i],c[i]);
        }else{
             c[i] = p[i];
        } 
    }
    return c;
});

可参考地址:
『小tip』JS严格模式(use strict)下不能使用arguments.callee的替代方案
Javascript 面向对象编程(一):封装
Javascript面向对象编程(二):构造函数的继承
Javascript面向对象编程(三):非构造函数的继承

小tips:JS之浅拷贝与深拷贝

标签:return   函数   深拷贝   ceo   面向   blank   tip   ons   www.   

原文地址:http://www.cnblogs.com/moqiutao/p/7510865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!