在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 淺談 Javascript 中深復制
淺談 JavaScript 之事件綁定
淺談 javascript 中字符串 String 與數(shù)組 Array
淺談 javascript 中基本包裝類型
淺談 JavaScript Math 和 Number 對象
淺談 Javascript 的靜態(tài)屬性和原型屬性
淺談 JavaScript 中定義變量時有無 var 聲明的區(qū)別
淺談 JavaScript Array 對象
淺談 JavaScript 函數(shù)參數(shù)的可修改性問題
淺談 javascript 中的 instanceof 和 typeof
淺談 JavaScript 中 Date (日期對象),Math 對象
淺談 Javascript 執(zhí)行順序
淺談 javascript 函數(shù)屬性和方法
淺談 JavaScript 中面向對象技術的模擬
淺談 javascript 的原型繼承
淺談 javascript 事件取消和阻止冒泡
根據(jù)一段代碼淺談 Javascript 閉包
淺談 Javascript 面向對象編程
淺談 javascript 六種數(shù)據(jù)類型以及特殊注意點
淺談 Javascript 變量作用域問題
淺談 javascript 函數(shù)內部屬性
淺談 javascript 中自定義模版
淺談 JavaScript 字符集
淺談 javascript 面向對象編程
淺談 JavaScript 框架分類
淺談 JavaScript 中的 Math.atan() 方法的使用
淺談 Javascript 數(shù)組與字典
淺談 JavaScript 數(shù)據(jù)類型及轉換
淺談 javascript 的調試
淺談 Javascript 嵌套函數(shù)及閉包
淺談 javascript 回調函數(shù)
淺談 JavaScript Date 日期和時間對象
淺談 Javascript 中的 Function 與 Object
淺談 JavaScript 數(shù)據(jù)類型
淺談 javascript 中 this 在事件中的應用
淺談 javascript 中的閉包
淺談 javascript 函數(shù)劫持
淺談 Javascript 中深復制
淺談 JavaScript 函數(shù)節(jié)流
淺談 JavaScript 中的 String 對象常用方法
淺談 JavaScript 事件的屬性列表
淺談 JavaScript 函數(shù)與棧
淺談 JavaScript 的事件
淺談 javascript 中的作用域
淺談 JavaScript 的執(zhí)行效率
淺談 Javascript 事件模擬
淺談 JavaScript function 函數(shù)種類
淺談 javascript 歸并方法
淺談 javascript 迭代方法
淺談 JavaScript 編程語言的編碼規(guī)范
淺談 JavaScript 實現(xiàn)面向對象中的類
淺談 Javascript 鼠標和滾輪事件
淺談 Javascript Base64 加密解密
淺談 Javascript 中勻速運動的停止條件
淺談 javascript 實現(xiàn)八大排序
淺談 javascript 的分號的使用
淺談 javascript 中 createElement 事件
淺談 javascript 的數(shù)據(jù)類型檢測
淺談 javascript 對象模型和 function 對象
淺談 Javascript 如何實現(xiàn)勻速運動
淺談 JavaScript 字符串與數(shù)組
淺談 javascript 面向對象程序設計
淺談 Javascript 事件處理程序的幾種方式

淺談 Javascript 中深復制

在 javascript 中,所有的 object 變量之間的賦值都是傳地址的,可能有同學會問哪些是 object 對象。舉例子來說明可能會比較好:

typeof(true)    //"boolean"  

typeof(1)       //"number"  

typeof("1")     //"string"  

typeof({})      //"object"  

typeof([])      //"object"  

typeof(null)    //"object"  

typeof(function(){})  //"function"  

所以其實我們深復制主要需要處理的對象就是 object 對象,非 object 對象只要直接正常的賦值就好。我實現(xiàn) js 深復制的思路就是:

遍歷所有該對象的屬性,

如果該屬性是 "object" 則需要特殊處理,

如果這個 object 對象比較特殊,是一個數(shù)組,那就創(chuàng)建一個新的數(shù)組并深復制數(shù)組里的元素

如果這個 object 對象是個非數(shù)組對象,那直接再對它遞歸調用深復制方法即可。

如果不是 "object",則直接正常復制就行。

下面就是我的實現(xiàn)了:

Object.prototype.DeepCopy = function () {  

  var obj, i;  

  obj = {};  
  for (attr in this) {  

    if (this.hasOwnProperty(attr)) {  

      if (typeof(this[attr]) === "object") {  

        if (this[attr] === null) {  

          obj[attr] = null;  

        }  

        else if (Object.prototype.toString.call(this[attr]) === '[object Array]') {  

          obj[attr] = [];  

          for (i=0; i<this[attr].length; i++) {  

            obj[attr].push(this[attr][i].DeepCopy());  

          }  

        } else {  

          obj[attr] = this[attr].DeepCopy();  

        }  

      } else {  

        obj[attr] = this[attr];  

      }  

    }  

  }  

  return obj;  

};  

如果瀏覽器支持 ECMAScript 5 的話,為了深復制對象屬性的所有特性,可以使用

Object.defineProperty(obj, attr, Object.getOwnPropertyDescriptor(this, attr));  

來替代

obj[attr] = this[attr];  

直接在 Object.prototype 上實現(xiàn)該方法的好處是,所有對象都會繼承該方法。壞處是某些庫也會改寫 Object 對象,所以有時會發(fā)生沖突。這是需要注意的。具體使用方法如下:

Object.prototype.DeepCopy = function () { ...}  

var a = {x:1};  

var b = a;  

var c = a.DeepCopy();  

a.x = 2;  

b.x = 3;  

console.log(a.x);   //3  

console.log(b.x);   //3  

console.log(c.x);   //1  

以上就是關于深復制的講解了,不過今天既然我們講了深復制,那么想對應的還有淺復制,我們就來簡單總結下他們之間的異同吧。

淺復制 (影子克隆): 只復制對象的基本類型, 對象類型, 仍屬于原來的引用。

深復制 (深度克隆): 不緊復制對象的基本類, 同時也復制原對象中的對象。就是說完全是新對象產(chǎn)生的。