[Java教程]js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

0 2017-11-03 18:00:09

我最近在做一个vue + element-UI + vue-resource + vuex项目的时候,遇到了一个对象的问题。

当我们在项目需要 复制一个对象到另一个对象并且  被复制的对象不能受复制后的对象的影响。

我先总结下 我们哪些方法可以复制对象// 直接赋值var obj1 = { a: 1 };var obj2 = obj1;console.log(obj2); // { a: 1 }// 通过 Object.assign() 这个属性来进行复制var obj = { a: 1 };var obj2 = Object.assign({}, obj);console.log(obj2); // { a: 1 }// 通过 for in 循环赋值var obj1={ a: 1, b: { c: 2 }, c: 0 }var obj2={}for( var key in obj1 ){ obj2[key]=obj[key]}console.log(obj2); // { a: 1, b: { c: 2 }, c: 0 }

以上的方法中 都可以把一个对象的键值赋值给另一个对象(但是我们可以测试出来obj2修改他的键值,obj1的键值也会被修改),

这就跟我家的钥匙刚开始是一把钥匙,然后我到配钥匙的地方配了一把一模一样的钥匙,那么我的这把原来的钥匙可以开我家的门,拿我家的东西,那么配的那把钥匙,也可以打开我家的门,拿走我家的东西。

其实我们想做的是,我们心买了一个房子,只是房子里的东西摆设跟我原来的房子是一模一样的,唯独不一样的就是,我原来家的钥匙只能开原来家的门,新家的钥匙只能开新家的门,虽然两个房子里的东西是一模一样的,但是都是没有实际的关联关系。那么这样我门需要怎么做呢。

我们可以先看看下面的这个方法// 使用 Object.assign() 方法复制对象let obj1 = { a: 0 , b: { c: 0}}; let obj2 = Object.assign({}, obj1); console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj1.a = 1; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj2.a = 2; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}} obj2.b.c = 3; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}

我们可以看到上面 Object.assign() 的这个方法虽然可以复制我第一层的对象值,并且当我obj2修改第一层的数据时,obj1不会受到影响。

但是我们在修改obj2 里 b 对象里的c的值得时候,这个时候 obj1 里的 b 对象里的 c 的值也发生了改变,这就说明了,Object.assign()这个方法不是深层的复制对象,只是让对象里第一层的数据没有了关联性,但是对象内的对象则跟被复制的对象有着关联性的。那么我们其实可以想象,怎么才能让他们完全没有关联性没呢。

字符串类型 和 对象类型 肯定是没有关联性的 ,因为它们的类型都不一样,肯定是没有可比性和关联性的。 有了这样的想法我觉得我们就有办法决绝这个问题了;

// 这个最简单暴力的处理 两个对象的关联性的问题 obj1 = { a: 0 , b: { c: 0}}; let obj3 = JSON.parse(JSON.stringify(obj1)); obj1.a = 4; obj1.b.c = 4; console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}

上面的代码已经可以体现出来我们刚才的一个假设,我们先把obj1 转成了字符串类型, 这样他就失去了对象的属性和一切的特性,然后我们再把它转成一个对象类型,这样我们心生成的对象是通过字符串转换过来的,已经是一个新的对象,然后再赋值给obj2 ,这样就相当于,我把我原来家的布置等东西,用设计稿的方式展现出来,然后我们又买了一个新家,按着原来的设计方式重构了出来,这样两个房子的内饰是一模一样的,但是门的钥匙不一样,这样就失去了以前的关联性。

以上的方法可以封装成方法方便使用var function cloneObjectFn (obj){ // 对象复制 return JSON.parse(JSON.stringify(obj))}var obj1={a:2,b{c:0}}var obj2=cloneObjectFn(obj1)console.log(obj2) // {a:2,b{c:0}}

第一次写博客,写的不好的地方希望各位不要喷(*^__^*)

本文网址:http://www.shaoqun.com/a/330330.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

JS

0

js 操作java对象_[Java教程]js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象...相关推荐

  1. java侧边栏_[Java教程]js实现的侧边栏展开收缩效果

    [Java教程]js实现的侧边栏展开收缩效果 0 2016-02-12 16:00:09 js实现的侧边栏展开收缩效果: 在很多应用中,尤其是客服系统一般具有这样的效果,那就是默认状态下,会折叠在网页 ...

  2. js字符串如何拼接java代码_[Java教程]js拼接字符串传值,子窗口传值

    [Java教程]js拼接字符串传值,子窗口传值 0 2015-10-26 21:00:15 避免下次再去查资料,记录一下 1.拼接字符串传值 "UpdateState?ids=" ...

  3. js hover 触发事件_为什么说JS的DOM操作很耗性能

    想问这样的问题,其实是自己心中没有个谱,一直用 js 计算性能来衡量 浏览器dom 操作性能.js性能和浏览器性能其实是两码事. 这个问题很抽象,它里面涉及挺多个小的知识点. 重申一点,js 操作 D ...

  4. java excel 操作 jar包_[JAVA]使用POI向Excel中写入数据以及如何在Intellj IDEA中打jar包...

    freddon 发表于2018-05-30 阅读 1383 | 评论 0 给GF写的,现在记录下POI操作Excel读写过程;以及如何在Intellj IDEA中打jar包 代码如下: ``` imp ...

  5. java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

    笔者以前学过C++语言.众所周知,C++也是一门面向对象程序设计语言.还记得当时在大学的时候,老师讲过这样的话:类的构造函数不应该设置成private权限,这样的话还怎么去实例化类的对象?当时也信以为 ...

  6. 在vscode运行js 输出会合并_前端系列——JS的运行与输出

    问题: JS如何被运行? JS运行后如何输出结果? 回答: 1--解答:JS的运行有两种方式,第一种是把代码放到浏览器中,让浏览器内核来渲染解析:第二种是基于NODE,NODE也是一种基于V8引擎的渲 ...

  7. vue.js组件的练习_由Vue.js开发的电阻器颜色练习网站

    vue.js组件的练习 ResisColor (ResisColor) ⚡ A resistor color practice website develop by Vue.js. ⚡电阻器颜色练习网 ...

  8. java心电图_使用原生js+canvas实现模拟心电图

    从2016年2月转行进入IT行业,到现在也有将近两年的时间了,从最开始的java到现在的前端,前进的路上一直靠自己摸索,一路走到现在,前端大神是绝对谈不上的,最多算一只刚入门的菜鸟. 从最开始的懵懵懂 ...

  9. js编码java解码_常用的js、java编码解码方法

    前言 前后端直接传输数据进行交互不就行了吗,为什么还要进行编码解码?正常情况下直接交互没问题,但当有类似以下情况出现时就需要进行编码再进行传输: 1.编码格式难以统一,导致数据交互过程出现中文乱码等问 ...

  10. java 爬虫js渲染_java_爬虫_获取经过js渲染后的网页源码

    md 弄了一天了--(这个月不会在摸爬虫了,浪费生命) 进入正题: 起初是想写一个爬虫来爬一个网站的视频,但是怎么爬取都爬取不到,分析了下源代码之后,发现源代码中并没有视频的dom 但是在浏览器检查元 ...

最新文章

  1. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]
  2. 设备和驱动在第一次加载,会遍历总线
  3. python 科学计算基础教程电子版-自学Python 编程基础、科学计算及数据分析
  4. python财务报表分析-用Python爬取东方财富网上市公司财务报表
  5. assembly x86(nasm)画三角形等图形的实现(升级版)
  6. Python生成html邮件
  7. 阿里云加入开放媒体联盟AOM
  8. 国产数据库崛起 Gartner!
  9. [leetcode]Search in Rotated Sorted Array II
  10. Keymob锁屏:三屏切换 开启移动入口平台新时代
  11. 计算机公开课打字游戏,H5公开课:古堡密卷--打字通关游戏设计及开发
  12. 高分子物理考研概念及要点、考点总结
  13. leetcode之GaryCode
  14. Distiller:量化算法
  15. Zend Studio 12.5注册码破解
  16. 表单验证与自定义表单验证
  17. 塔罗牌微信小程序源码
  18. f_sync有大用但不可以滥用
  19. Tomcat启动时,日志的中文乱码【淇℃伅】和【璀﹀憡】等
  20. 亿联话机修改SIP端口及开启stun

热门文章

  1. 6.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Lua 语言
  2. 1. Browser 对象 - Window 对象
  3. J2EE中使用jstl报http //java sun com/jsp/jstl/core cannot be reso
  4. android中的适配器模式
  5. Httpwatch抓包
  6. 常用HTML转义字符,
  7. 启动提示archlinux中virtualbox无法运行问题解决
  8. 控制台或者dll中CreateWindow 出错
  9. 组合选择符 深入了解
  10. 如何阅读《深入理解计算机系统》这本书?