摘要:判斷參數(shù)是否為待判斷的參數(shù)克隆一個對象要克隆的目標對象克隆節(jié)點,綁定事件的有問題,暫不處理克隆在當前作用域,在全局克隆其它對象,通過識別復制后的對象與原對象是否相同來決定傳不傳參數(shù),像數(shù)組是不能傳參數(shù)的使用防止對象重寫了方法支持節(jié)點克隆
(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){ /// 克隆一個對象 /// 要克隆的目標對象 ///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é)點,綁定事件的有問題,暫不處理 else if (Utils.isFunction(obj)) clone = new Function("return " + obj)(); //克隆function eval在當前作用域,F(xiàn)untion在全局 else clone = (temp = obj.constructor, clone = new temp(obj.valueOf()), obj == clone) ? new temp() : clone; //克隆其它對象,通過識別復制后的對象與原對象是否相同來決定傳不傳參數(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 防止對象obj重寫了hasOwnProperty方法 return clone } }());
支持節(jié)點克隆,對象克隆,同時也支持循環(huán)引用的對象克隆。
比如:
var souceObj={ childObj:{ } }; sourceObj.childObj.child=sourceObj;
這樣一個循環(huán)引用的對象也可以正常克隆
cloneObj=Utils.clone(sourceObj);克隆后,同樣保持與原來相同的引用關(guān)系
對于
var obj={};
var a={};
a.b=obj;
a.c=obj;
var d=Utils.clone(a);
在clone之前
a.b.f="123";
那么a.c也就有了一個f 為 "123";
但對于 clone之后的d 也有這功能
然而,每段代碼或解決方案都有它的適用范圍,以上代碼也無法保證在所有瀏覽器中對任意對象克隆均能正常工作,您應當看懂理解代碼,學以至用,而不是簡單的把代碼復制過去
以上代碼在opera某些版本下克隆正則有問題,已滿足大部分需求
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/87846.html
摘要:深拷貝是一件看起來很簡單的事情,但其實一點兒也不簡單。我們也可以利用這個實現(xiàn)對象的深拷貝。而是利用之前已經(jīng)拷貝好的值。深拷貝的詳細的源碼可以在這里查看。大功告成我們雖然的確解決了深拷貝的大部分問題。 js深拷貝是一件看起來很簡單的事情,但其實一點兒也不簡單。對于循環(huán)引用的問題還有一些內(nèi)置數(shù)據(jù)類型的拷貝,如Map, Set, RegExp, Date, ArrayBuffer 和其他內(nèi)置...
摘要:多個窗口意味著多個全局環(huán)境,不同的全局環(huán)境擁有不同的全局對象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。比如,表達式會返回,因為屬性得到的僅僅是構(gòu)造函數(shù),而且是可以被手動更改的,只是返回的構(gòu)造函數(shù)的名字,它并不返回類名。 原文:ES6時代,你真的會克隆對象嗎(二) 上一篇,我們從Symbol和是否可枚舉以及屬性描述符的角度分析了ES6下怎么淺拷貝一個對象,發(fā)表在掘金和segmentfault上(...
摘要:引用類型之所以會出現(xiàn)深淺拷貝的問題,實質(zhì)上是由于對基本類型和引用類型的處理不同。另外方法可以視為數(shù)組對象的淺拷貝。上面描述過的復雜問題依然存在,可以說是最簡陋但是日常工作夠用的深拷貝方式。 一直想梳理下工作中經(jīng)常會用到的深拷貝的內(nèi)容,然而遍覽了許多的文章,卻發(fā)現(xiàn)對深拷貝并沒有一個通用的完美實現(xiàn)方式。因為對深拷貝的定義不同,實現(xiàn)時的edge case過多,在深拷貝的時候會出現(xiàn)循環(huán)引用等問...
閱讀 3109·2021-11-02 14:40
閱讀 889·2019-08-30 15:53
閱讀 1346·2019-08-30 15:53
閱讀 3318·2019-08-30 13:53
閱讀 3377·2019-08-29 12:50
閱讀 1196·2019-08-26 13:49
閱讀 1930·2019-08-26 12:20
閱讀 3727·2019-08-26 11:33