资讯专栏INFORMATION COLUMN

Object的底层实现以及深拷贝和浅拷贝

loostudy / 2103人阅读

对象合并

Object.defineProperty(Object, "myAssign", {
  configurable: true,
  enumerable: true,
  writable: false,
  value: function() {
    if (arguments[0] === undefined) {
      throw Error("dest can not be undefined");
    }
    let rest = Array.prototype.slice.call(arguments, 1);
    Array.prototype.forEach.call(rest, function(source) {
      Object.getOwnPropertyNames(source).forEach(function(prop) {
        Object.defineProperty(arguments[0], prop, {
          configurable: true,
          enumerable: true,
          writable: true,
          value: source[prop]
        });
      });
    });
  }
});

浅复制

Object.defineProperty(Object, "shallowClone", {
  configurable: true,
  enumerable: true,
  writable: false,
  value: function(dest, source) {
    if (dest === undefined) {
      throw Error("dest can not be undefined");
    }
    Object.getOwnPropertyNames(source).forEach(function(prop) {
      Object.defineProperty(dest, prop, {
        configurable: true,
        enumerable: true,
        writable: true,
        value: source[prop]
      });
    });
  }
});

深复制

Object.defineProperty(Object, "deepClone", {
  configurable: true,
  enumerable: true,
  writable: false,
  value: function(dest, source) {
    if (dest === undefined || source === undefined) {
      throw Error("dest can not be undefined");
    }
    if (!(source instanceof Object)) {
      throw Error(source, "is not a object");
    }
    Object.getOwnPropertyNames(source).forEach(function(prop) {
      if (typeof source[prop] === Object) {
        Object.deepClone(dest[prop], source[prop]);
      } else {
        dest[prop] = source[prop];
      }
    });
  }
});
const a = {
  x: 1,
  y: 2,
  z: {
    m: 3,
    n: 4
  }
}

const b = {
  r: 4,
  s: 5,
  z: {
    m: 5,
    n: 6
  }
}

Object.deepClone(a, b);

console.log(a);
b.z.m = 12;
console.log(a);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106552.html

相关文章

  • 浅探js拷贝和浅拷贝

    摘要:接下来就让我们更细致的探究中的深浅拷贝。总结以上对深拷贝和浅拷贝做了简单的介绍,在深拷贝的实现上也只介绍了最简单的实现形式,并未考虑复杂情况以及相应优化,想要对深拷贝有更深入的了解,需要大家花时间去深入研究,或者可以关注我后续文章的动态。 对象和数组的拷贝对我来说一直都是一个比较模糊的概念,一直有点一知半解,但是在实际工作中又偶尔会涉及到,有时候还会一不小心掉坑里,不知道大家有没有同样...

    habren 评论0 收藏0
  • 浅谈拷贝和浅拷贝

    摘要:而引用类型值是指那些保存堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。而堆内存主要负责对象这种变量类型的存储。我们需要明确一点,深拷贝与浅拷贝的概念只存在于引用类型。 深拷贝和浅拷贝 说起深拷贝和浅拷贝,首先我们来看两个栗子 // 栗子1 var a = 1,b=a; console.log(a); console.log(b) ...

    littleGrow 评论0 收藏0
  • js拷贝和浅拷贝

    摘要:深拷贝和浅拷贝深拷贝和浅拷贝的示意图大致如下浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。参考文章什么是深拷贝和浅拷贝及其实现方式 走在前端的大道上 本篇将自己读过的相关文章中,对自己有启发的章节片段总结在这(会对原文进行删改),会不断丰富提炼总结更新。 浅拷贝 var m = { a: 10, b: 20 } var n = m; n.a = 15; ...

    MAX_zuo 评论0 收藏0
  • JavaScript赋值、拷贝和浅拷贝

    摘要:内存空间分为两种,栈内存与堆内存栈是系统自动分配的内存空间,由系统自动释放,堆则是动态分配的内存,大小不定不会自动释放。 JavaScript的内存空间 在JavaScript中,每一个数据都需要一个内存空间。内存空间分为两种,栈内存(stack)与堆内存(heap) 栈是系统自动分配的内存空间,由系统自动释放,堆则是动态分配的内存,大小不定不会自动释放。 基本数据类型 JavaScr...

    godlong_X 评论0 收藏0
  • 拷贝和浅拷贝全面理解

    摘要:关于深拷贝和浅拷贝从原理看浅拷贝拷贝一层,对象级别的则拷贝引用深拷贝拷贝多层,每个层级的属性都会拷贝从现象看复制了,被修改后,随变化而变化浅拷贝不变深拷贝深拷贝针对的复杂的类型数据如直接赋值的单层拷贝,如,虽然不受的影响,但是这也不算做 关于深拷贝和浅拷贝 从原理看: 浅拷贝:拷贝一层,对象级别的则拷贝引用 深拷贝:拷贝多层,每个层级的属性都会拷贝 从现象看:A复制了B,B被修改后...

    _DangJin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<