<script type="text/javascript" src="jquery
<script>
obj
obj
$
alert(obj
obj
alert(obj
alert(obj
</script>
$
雖然obj
淺復制的實現
如果僅僅需要實現淺復制
$ = {
extend : function(target
for (name in options) {
target[name] = options[name];
}
return target;
}
};
也就是簡單地將options中的屬性復制到target中
<script type="text/javascript" src="jquery
<script>
obj
obj
$
alert(obj
obj
alert(obj
alert(obj
</script>
obj
深復制的實現
如果我們希望實現“深復制”
$ = {
extend : function(deep
for (name in options) {
copy = options[name];
if (deep && copy instanceof Array) {
target[name] = $
} else if (deep && copy instanceof Object) {
target[name] = $
} else {
target[name] = options[name];
}
}
return target;
}
};
具體分為三種情況
測試代碼如下
<script type="text/javascript" src="jquery
<script>
obj
obj
$
alert(obj
obj
alert(obj
alert(obj
</script>
現在如果指定為深復制的話
更完整的實現
下面的實現與jQuery中的extend()會更接近一些
$ = function() {
var copyIsArray
toString = Object
hasOwn = Object
class
}
type = function(obj) {
return obj == null ? String(obj) : class
}
isWindow = function(obj) {
return obj && typeof obj === "object" && "setInterval" in obj;
}
isArray = Array
return type(obj) === "array";
}
isPlainObject = function(obj) {
if (!obj || type(obj) !== "object" || obj
return false;
}
if (obj
&& !hasOwn
return false;
}
var key;
for (key in obj) {
}
return key === undefined || hasOwn
}
extend = function(deep
for (name in options) {
src = target[name];
copy = options[name];
if (target === copy) { continue; }
if (deep && copy
&& (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && isArray(src) ? src : [];
} else {
clone = src && isPlainObject(src) ? src : {};
}
target[name] = extend(deep
} else if (copy !== undefined) {
target[name] = copy;
}
}
return target;
};
return { extend : extend };
}();
首先是 $ = function(){
func = function(){
$ = func();
也就是立即執行函數
return { extend : extend };
接下來
if (target === copy) { continue; }
這是為了避免無限循環
然後是判斷對象是否為數組的方式
type = function(obj) {
return obj == null ? String(obj) : class
}
isArray = Array
return type(obj) === "array";
}
如果浏覽器有內置的Array
最後逐句地看看isPlainObject的實現
if (!obj || type(obj) !== "object" || obj
return false;
}
如果定義了obj
之所以不對DOM元素和window進行深復制
接下來是與構造函數相關的測試
if (obj
&& !hasOwn
return false;
}
如果對象具有構造函數
var key;
for (key in obj) {
}
return key === undefined || hasOwn
這幾句代碼是用於檢查對象的屬性是否都是自身的
這 說明如果對象是通過prototype方式繼承了構造函數或者屬性
如果我們用如下代碼進行測試
<script type="text/javascript" src="jquery
<script>
function O() {
this
}
function X() {
this
}
X
x = new X();
obj
obj
$
alert(obj
obj
alert(obj
</script>
可以看到
總之
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19999.html