最近用到一個web ui外掛程式,不過他的調用時全域變數,
也就是說一個頁面只能用一次,這個外掛程式挺好用的只是我的頁面需要2個以上
這樣的外掛程式,所以我想到了js對象的複製。
思路:複製一個對象(不是引用,引用還是同一個對象),然後
把新的對象的關鍵屬性(比如id)改改,這樣就變成了2個不同的對象。
我可以在頁面對這2個對象進行改動而互不影響。
遺憾的是js沒有現成的clone方法,需要自己寫。
網上也有人寫過這樣的方法,不過會有問題,因為要遞迴。
而我試了一下,真的出了問題,根本不能用。
不過jquery的extend可以實現,這個經過實際測試,所以今天記錄下來。
// 淺層複製(只複製頂層的非 object 元素)
//var newObject = jQuery.extend({}, oldObject);
// 深層複製(一層一層往下複製直到最底層)
//var newObject = jQuery.extend(true, {}, oldObject);
function clone(o) {if (!o) {return o;} else {var c;if (Object.prototype.toString.apply(o) === '[object Array]') {c = [];for (var i = 0; i < o.length; i++) {c.push(clone(o[i]));} // 採用這種判斷,而非typeof(o) === 'object',這裡只處理Object, //而不處理其他包括Array、String、Date、Function等,但由new建立的Function對象的也是Object } else if (Object.prototype.toString.call(o) === '[object Object]') {c = {};for (var p in o) {c[p] = clone(o[p]);}} else {return o;} return c; }}function clonedd(myObj){ if(typeof(myObj) != 'object') return myObj; if(myObj == null) return myObj; var myNewObj = new Object(); for(var i in myObj) myNewObj[i] = clonedd(myObj[i]); return myNewObj;}function myclone(obj){var arr1 = new Array();arr1.push(obj);var arr2 = [].concat(arr1);var res=arr2[0];return res;}// 淺層複製(只複製頂層的非 object 元素)//var newObject = jQuery.extend({}, oldObject);// 深層複製(一層一層往下複製直到最底層)//var newObject = jQuery.extend(true, {}, oldObject);
下面是我使用全域變數navTab,
複製這個變數得到a,再改變它的一個屬性id,ok完成複製。
$(function(){navTab.init({id:"navTab"});var a = jQuery.extend(true, {}, navTab);a.init({id:"navTab2"});});