当前位置: 首页 > news >正文

JavaScript中的对象复制(Object Clone)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

JavaScript中并没有直接提供对象复制(Object Clone)的方法。因此下面的代码中改变对象b的时候,也就改变了对象a。

a = {k1:1, k2:2, k3:3};b = a;b.k2 = 4;

如果只想改变b而保持a不变,就需要对对象a进行复制。

用jQuery进行对象复制

在可以使用jQuery的情况下,jQuery自带的extend方法可以用来实现对象的复制。

a = {k1:1, k2:2, k3:3};b = {};$.extend(b,a);

自定义clone()方法来实现对象复制

下面的方法,是对象复制的基本想法。

Object.prototype.clone = function() {
  var copy = (this instanceof Array) ? [] : {};
  for (attr in this) {
    if (!obj.hasOwnProperty(attr)) continue;
    copy[attr] = (typeof this[i] == "object")?obj[attr].clone():obj[attr];
  } 
  return copy;};a = {k1:1, k2:2, k3:3};b = a.clone();

下面的例子则考虑的更全面些,适用于大部分对象的深度复制(Deep Copy)。

function clone(obj) {
    // Handle the 3 simple types, and null or undefined
    if (null == obj || "object" != typeof obj) return obj;

    // Handle Date
    if (obj instanceof Date) {
        var copy = new Date();
        copy.setTime(obj.getTime());
        return copy;
    }

    // Handle Array
    if (obj instanceof Array) {
        var copy = [];
        for (var i = 0, var len = obj.length; i < len; ++i) {
            copy[i] = clone(obj[i]);
        }
        return copy;
    }

    // Handle Object
    if (obj instanceof Object) {
        var copy = {};
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
        }
        return copy;
    }

    throw new Error("Unable to copy obj! Its type isn't supported.");}

网络资源

  • Copying an Object in Javascript


转载于:https://my.oschina.net/soarwilldo/blog/406883

相关文章:

  • C#后台传入数据JS接收
  • petstore-jdbc
  • css3 动画
  • [OS] linux常见问题汇总
  • Lua 程序设计 (Roberto,Ierusalimschy 著)
  • c3p0 连接过多导致tomcat无法启动的解决方法
  • memcache set方法 MEMCACHE_COMPRESSED
  • if(A B || C),应该如何解释满足A、B、C之间的关系
  • Web前端开发的主要职责
  • 啊啊啊
  • 60、70后的互联网恐慌来源于圈地思维失效
  • python3的urllib2报错问题解决方法
  • mkbootimg hacking
  • linux启动常见故障
  • 一站式学习Wireshark(一):Wireshark基本用法
  • 2018一半小结一波
  • docker python 配置
  • JavaScript-Array类型
  • Javascript编码规范
  • Python 反序列化安全问题(二)
  • Python爬虫--- 1.3 BS4库的解析器
  • Python学习之路16-使用API
  • 分布式事物理论与实践
  • 聚类分析——Kmeans
  • 你不可错过的前端面试题(一)
  • 软件开发学习的5大技巧,你知道吗?
  • 使用docker-compose进行多节点部署
  • 跳前端坑前,先看看这个!!
  • MPAndroidChart 教程:Y轴 YAxis
  • Prometheus VS InfluxDB
  • Spring Batch JSON 支持
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (九)c52学习之旅-定时器
  • (离散数学)逻辑连接词
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (全注解开发)学习Spring-MVC的第三天
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (算法)求1到1亿间的质数或素数
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net反编译工具
  • .NET建议使用的大小写命名原则
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET学习全景图
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @31省区市高考时间表来了,祝考试成功
  • @ComponentScan比较
  • @RequestParam详解