在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针、引用、地址之类的,所以直接用"="就可以把一个对象复制给另外一个对象,如下代码:
代码1
var i1 = 1; var i2 = i1; i2 = 2; alert("i1:"+i1+",i2:"+i2); 输出结果:i1:1 , i2:2
但可能没有发现,这种“复制”用在对象(object)类型是“错误”的,因为这只是把对象的地址复制,所以如下代码会进行了一次“错误”的复制:
代码2 var o1 = {i : 1,s : "o1"}; var o2 = o1; o2.i=2; o2.s="o2"; alert("o1.i:"+o1.i+",o2.i:"+o2.i); alert("o1.s:"+o1.s+",o2.s:"+o2.s); 输出:o1.i:2 , o2.i:2
o1.s:o2 , o2.s:o2
可能你会问为什么代码1 可以复制,但 代码2 却没有复制?
其实真确来说是基本数据类型可以复制,非基本类型(包括字符串)只复制其引用。为什么要这样做呢?原因很简单,为了减少开销。大家都知道非基本类型有时候很大,如果重新开辟内存来存放一个这么大的对象,开销很大,导致运行会很慢。脚本语言是直接在虚拟机(或者浏览器)运行,它经过虚拟机这一层来处理代码,速度已经相对其他编译语言慢很多,所以如果把非基本对象再做“复制”,那么可能你要等上一年半载才能运行得了程序,因此只能复制对象的引用。
如果需要把整个对象复制,必须一个一个属性或方法引用复制一偏,这样为每个属性开辟内存来存放你需要的数据,当然这样相对来说会很慢,尤其数据量很多的时候,下面是本人写的对象复制函数:
代码3
function cloneAll(fromObj,toObj){ for(var i in fromObj){ if(typeof fromObj[i] == "object"){ toObj[i]={}; cloneAll(fromObj[i],toObj[i]); continue; } toObj[i] = fromObj[i]; } } 把fromObj对象复制到toObj
js重写父类方法的问题
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> <!-- function Rect(config){ this.width = config.width; this.height = config.height; this.area = function(){ alert(11); }; } function myRect(config){ Rect.call(this,config); this.name = config.name; this.area = function(){ //这里如何调用一下父类的area方法? alert(22); //最终效果,是先alert(11),然后alert(22); } } var a =new myRect({width:1,heigth:2,name:3}); a.area(); //--> </SCRIPT> </BODY> </HTML>
相关推荐
拷贝Javascript对象复制工具用于复制,克隆和合并对象的通用工具集。 节点使用情况: var jsoCopy = require ( 'jsocopy.js' ) // or 'jsocopy.min.ja' , jsoClone = require jsoCopy . clone , jsoMerge = require ...
js克隆使用深度复制的Javascript对象复制用法var deepClone = require ( './js-clone/index.js' ) ;var object = { name : 'Kator James' , work : { companyName : 'LogicalAddress Ltd' , getCompanyName : ...
主要介绍了JS对象深度克隆,结合实例形式分析了JavaScript对象深度克隆的实现方法与相关注意事项,需要的朋友可以参考下
克隆javascript对象的三个方法整理,需要的朋友可以参考下。
例子将js对象复制到a.json文件中: { str : 'str' , num : 1 , boo : true , nil : null , arr : [ 0 , ' 1 ' , true ], obj : { str : 'obj.str' , num : 1.2 , boo : false , nil : null , },} 并使用推荐的js2...
主要介绍了JS对象的深度克隆方法,结合实例形式分析了JavaScript深度克隆的实现技巧,需要的朋友可以参考下
JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕。 平时发的文章基本都是开发中遇到的问题和对最佳解决方案的探讨,终于忍不住要写一篇基础概念类的文章了。 本文探讨...
nanoclone - 只有145B实现深度克隆JavaScript对象
主要介绍了js对象的复制继承用法,以一个较为简单的实例分析了js对象复制继承的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了JavaScript对象拷贝与Object.assign用法。分享给大家供大家参考,具体如下: 深拷贝与浅拷贝 在 JavaScript 中,对于基本数据类型(undefined、null、boolean、number、string)来说,在变量中存储的...
JavaScript 深层克隆对象 今天做项目,有个需求需要用到深层克隆对象,并且要求在原型链上编程 于是心血来潮索性来复习一下这个知识点,在网上找了相应的知识, 克隆对象,这名词看着高大上,其实也没什么,便是拷贝...
复制、克隆和合并全部或部分 javascript 对象。 安装 轻松通过 。 npm install copy-object 用法 var result = copyObject ( sourceObject [ , destinationObject , keyList ] ) destinationObject是,如果未...
在js中如何复制一个对象,例如如下一个js对象。 如果知道这个对象的所有属性自然就可以重新new一个,然后对每个属性赋值,就可以做到,但如果不知道呢?如何创建一个内容相同 的对象呢? 代码如下: var obj={ colkey...
深化理解JavaScript中的对象复制(Object Clone)_.docx
深度克隆JavaScript对象(包括其直接原型),而不会无意间从全局原型中复制方法和值。 还可以在新创建的对象中复制循环关系。 安装 npm install smartclone 用法 var smartClone = require ( "smartclone" ) ; var...
一个用于对象深度克隆的同构和可配置javascript函数
委托对象 将属性从一个对象复制到另一个对象,其中具有函数值的属性将在接收方的上下文中被调用,而具有非函数值的属性仅被复制。 用安装$ npm i delegate-object --save用法var delegateObject = require ( '...
deeplyAssign 将所有可枚举的属性和符号属性的值从一个或多个源对象深度复制到目标对象。它将返回目标对象。使用TypeScript编写。
主要介绍了Javascript对象Clone用法,实例分析了javascript对象克隆的相关技巧,需要的朋友可以参考下