JavaScript 並非絕對化的面向對象的語言,里面也有很多非結構化和結構化的數據。賦值語句並不能復制結構化的數據對象。
例如:
var S1 = []
var A = obj(),
var B = obj();
Stack.push(A);
Stack.push(B);
Var S2 = []
S2 = S1;
S1是一個對象數組,里面放了兩個對象數據A和B,在賦值操作的時候,A,B對象不會被創建,而只是指向A,B的鏈接。
下面三種方式,可以實現對象的克隆:
1、 如果你知道A,B的數據結構信息,直接寫克隆函數,創建A,B中的類對象,子類對象,然后將S1這些對象條件到S2中去。
2、深度復制對象,將對象一層一層的扒開,迭代的方式將里面的實例創建並賦值。
//深復制對象方法
var cloneObj2 = function (obj) {
var newObj = {};
if (obj instanceof Array) {
newObj = [];
}
for (var key in obj) {
var val = obj[key];
newObj[key] = typeof val === 'object' ? cloneObj2(val): val; // 如果是對象,迭代
}
return newObj;
};
3. JSON將數據序列化,
function cloneObj(obj) {
//1
var newJsonObj = {};
newJsonObj = JSON.parse(JSON.stringify(obj));
//2
for (items in obj) {
if (typeof obj[items] == "function" || typeof obj[items] == "undefined" || obj[items] instanceof RegExp) {
newJsonObj[items] = obj[items];
}
}
//3
var newObj = new obj.constructor;
for (items in newJsonObj) {
newObj[items] = newJsonObj[items]
}
return newObj;
}