摘要:判斷參數(shù)是否為待判斷的參數(shù)克隆一個(gè)對(duì)象要克隆的目標(biāo)對(duì)象克隆節(jié)點(diǎn),綁定事件的有問(wèn)題,暫不處理克隆在當(dāng)前作用域,在全局克隆其它對(duì)象,通過(guò)識(shí)別復(fù)制后的對(duì)象與原對(duì)象是否相同來(lái)決定傳不傳參數(shù),像數(shù)組是不能傳參數(shù)的使用防止對(duì)象重寫了方法支持節(jié)點(diǎn)克隆
(function(){ var toString=Object.prototype.toString,gObj={},cloneHelper=function(cache,item){ ///helper for Utils.clone if ("object" == typeof item || Utils.isFunction(item)) { for (var i = cache.length - 2; i>=0; i -= 2) { if (cache[i] == item) return cache[i + 1] } cache.push(item, item = Utils.clone(item, cache)) } return item }; window.Utils={ isFunction:function(it){ ///判斷參數(shù)是否為Function /// 待判斷的參數(shù) ///return toString.call(it)=="[object Function]"; }, clone:function(obj,cache){ /// 克隆一個(gè)對(duì)象 /// 要克隆的目標(biāo)對(duì)象 ///cache || (cache = []); var clone,temp; if (!obj || (!Utils.isFunction(obj) && typeof obj != "object")) return o; else if (obj.cloneNode) return o.cloneNode(true);//克隆DOM節(jié)點(diǎn),綁定事件的有問(wèn)題,暫不處理 else if (Utils.isFunction(obj)) clone = new Function("return " + obj)(); //克隆function eval在當(dāng)前作用域,F(xiàn)untion在全局 else clone = (temp = obj.constructor, clone = new temp(obj.valueOf()), obj == clone) ? new temp() : clone; //克隆其它對(duì)象,通過(guò)識(shí)別復(fù)制后的對(duì)象與原對(duì)象是否相同來(lái)決定傳不傳參數(shù),像數(shù)組是不能傳參數(shù)的 cache.push(obj,clone); for (temp in obj) if (gObj.hasOwnProperty.call(obj,temp)) clone[temp] = cloneHelper(cache,obj[temp]);//使用gObj.hasOwnProperty 防止對(duì)象obj重寫了hasOwnProperty方法 return clone } }());
支持節(jié)點(diǎn)克隆,對(duì)象克隆,同時(shí)也支持循環(huán)引用的對(duì)象克隆。
比如:
var souceObj={ childObj:{ } }; sourceObj.childObj.child=sourceObj;
這樣一個(gè)循環(huán)引用的對(duì)象也可以正??寺?/p>
cloneObj=Utils.clone(sourceObj);克隆后,同樣保持與原來(lái)相同的引用關(guān)系
對(duì)于
var obj={};
var a={};
a.b=obj;
a.c=obj;
var d=Utils.clone(a);
在clone之前
a.b.f="123";
那么a.c也就有了一個(gè)f 為 "123";
但對(duì)于 clone之后的d 也有這功能
然而,每段代碼或解決方案都有它的適用范圍,以上代碼也無(wú)法保證在所有瀏覽器中對(duì)任意對(duì)象克隆均能正常工作,您應(yīng)當(dāng)看懂理解代碼,學(xué)以至用,而不是簡(jiǎn)單的把代碼復(fù)制過(guò)去
以上代碼在opera某些版本下克隆正則有問(wèn)題,已滿足大部分需求
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87846.html
摘要:深拷貝是一件看起來(lái)很簡(jiǎn)單的事情,但其實(shí)一點(diǎn)兒也不簡(jiǎn)單。我們也可以利用這個(gè)實(shí)現(xiàn)對(duì)象的深拷貝。而是利用之前已經(jīng)拷貝好的值。深拷貝的詳細(xì)的源碼可以在這里查看。大功告成我們雖然的確解決了深拷貝的大部分問(wèn)題。 js深拷貝是一件看起來(lái)很簡(jiǎn)單的事情,但其實(shí)一點(diǎn)兒也不簡(jiǎn)單。對(duì)于循環(huán)引用的問(wèn)題還有一些內(nèi)置數(shù)據(jù)類型的拷貝,如Map, Set, RegExp, Date, ArrayBuffer 和其他內(nèi)置...
摘要:多個(gè)窗口意味著多個(gè)全局環(huán)境,不同的全局環(huán)境擁有不同的全局對(duì)象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。比如,表達(dá)式會(huì)返回,因?yàn)閷傩缘玫降膬H僅是構(gòu)造函數(shù),而且是可以被手動(dòng)更改的,只是返回的構(gòu)造函數(shù)的名字,它并不返回類名。 原文:ES6時(shí)代,你真的會(huì)克隆對(duì)象嗎(二) 上一篇,我們從Symbol和是否可枚舉以及屬性描述符的角度分析了ES6下怎么淺拷貝一個(gè)對(duì)象,發(fā)表在掘金和segmentfault上(...
摘要:克隆的概念淺克隆原始類型為值傳遞,對(duì)象類型仍為引用傳遞。深度克隆檢驗(yàn)參數(shù),如果不是對(duì)象直接返回原型鏈上繼承過(guò)來(lái)的屬性無(wú)法通過(guò)檢測(cè)到,返回。方法用于將字符串解析為,可以任意轉(zhuǎn)換生成的值及其屬性,并返回值。 克隆的概念 淺克?。涸碱愋蜑橹祩鬟f,對(duì)象類型仍為引用傳遞。深克?。核性鼗?qū)傩跃耆珡?fù)制,與原對(duì)象完全脫離,也就是說(shuō)所有對(duì)于新對(duì)象的修改都不會(huì)反映到原對(duì)象中。 淺克隆就是將棧內(nèi)存中...
摘要:結(jié)構(gòu)化算法優(yōu)于的地方優(yōu)于的地方結(jié)構(gòu)化克隆可以復(fù)制對(duì)象。的克隆粒度將會(huì)跟原始對(duì)象相同,并且復(fù)制出來(lái)相同的像素?cái)?shù)據(jù)。企圖去克隆節(jié)點(diǎn)同樣會(huì)拋出異常。消息通道的傳遞是異步的,使用結(jié)構(gòu)化克隆算法。 JavaScript 深拷貝性能分析(漢化版) JavaScript 深拷貝性能分析 Object.assign() Object.assign 方法只會(huì)拷貝源對(duì)象自身的并且可枚舉的屬性到目標(biāo)對(duì)象。...
摘要:引用類型之所以會(huì)出現(xiàn)深淺拷貝的問(wèn)題,實(shí)質(zhì)上是由于對(duì)基本類型和引用類型的處理不同。另外方法可以視為數(shù)組對(duì)象的淺拷貝。上面描述過(guò)的復(fù)雜問(wèn)題依然存在,可以說(shuō)是最簡(jiǎn)陋但是日常工作夠用的深拷貝方式。 一直想梳理下工作中經(jīng)常會(huì)用到的深拷貝的內(nèi)容,然而遍覽了許多的文章,卻發(fā)現(xiàn)對(duì)深拷貝并沒(méi)有一個(gè)通用的完美實(shí)現(xiàn)方式。因?yàn)閷?duì)深拷貝的定義不同,實(shí)現(xiàn)時(shí)的edge case過(guò)多,在深拷貝的時(shí)候會(huì)出現(xiàn)循環(huán)引用等問(wèn)...
閱讀 3044·2021-11-02 14:40
閱讀 854·2019-08-30 15:53
閱讀 1273·2019-08-30 15:53
閱讀 3269·2019-08-30 13:53
閱讀 3313·2019-08-29 12:50
閱讀 1142·2019-08-26 13:49
閱讀 1874·2019-08-26 12:20
閱讀 3672·2019-08-26 11:33