针对本话题,我在2015年5月宣布了新的文章:深切理会 JavaScript 的深复制
要完成深复制有许多要领,比方最简朴的要领有:
var cloneObj = JSON.parse(JSON.stringify(obj));
上面这类要领优点是异常简朴易用,然则害处也不言而喻,这会扬弃对象的constructor,也就是深复制以后,不管这个对象底本的组织函数是什么,在深复制以后都邑变成Object。别的诸如RegExp
对象是没法经由历程这类体式格局深复制的。
所以这里我将引见一种,我自认为很幽美的深复制要领,固然能够也存在题目。假如你发现了我的完成要领有什么题目,请实时让我晓得~
先决条件:
1. 关于任何对象,它能够的范例有Boolean
, Number
, Date
, String
, RegExp
, Array
以及 Object
(一切自定义的对象全都继续于Object
)
2. 我们必需保存对象的组织函数信息(从而使新对象能够运用定义在prototype
上的函数)
最重要的一个函数:
Object.prototype.clone = function () {
var Constructor = this.constructor;
var obj = new Constructor();
for (var attr in this) {
if (this.hasOwnProperty(attr)) {
if (typeof(this[attr]) !== "function") {
if (this[attr] === null) {
obj[attr] = null;
}
else {
obj[attr] = this[attr].clone();
}
}
}
}
return obj;
};
定义在Object.prototype
上的clone()
函数是全部要领的中心,关于恣意一个非js预定义的对象,都邑挪用这个函数。而关于一切js预定义的对象,如Number
,Array
等,我们就要完成一个辅佐clone()
函数来完成完全的克隆历程:
/* Method of Array*/
Array.prototype.clone = function () {
var thisArr = this.valueOf();
var newArr = [];
for (var i=0; i<thisArr.length; i++) {
newArr.push(thisArr[i].clone());
}
return newArr;
};
/* Method of Boolean, Number, String*/
Boolean.prototype.clone = function() { return this.valueOf(); };
Number.prototype.clone = function() { return this.valueOf(); };
String.prototype.clone = function() { return this.valueOf(); };
/* Method of Date*/
Date.prototype.clone = function() { return new Date(this.valueOf()); };
/* Method of RegExp*/
RegExp.prototype.clone = function() {
var pattern = this.valueOf();
var flags = '';
flags += pattern.global ? 'g' : '';
flags += pattern.ignoreCase ? 'i' : '';
flags += pattern.multiline ? 'm' : '';
return new RegExp(pattern.source, flags);
};
能够直接定义在预定义对象的要领上,让人觉得会有些题目。但在我看来这是一种幽美的完成体式格局。
同时我也在开辟一个插件,重要的头脑也就是扩大预定义对象的要领。
这个插件叫JustJS
(Github项目地点)
有以下一些特征:
1. 同时支撑Web
前端和node.js
运用。
2. 直接对预定义对象的要领举行扩大
3. 运用 J(function(){...})
语句块,决不污染全局定名空间。
现在只写了一小部分,同时也写了些简朴的文档,有兴致的同砚能够看一下,也能够到场我,Fork
我的项目,喜好的同砚还能够给Star
!