當然由于我們可以使用typeof方法擷取對象的基本類型,然後一個switch,該幹嘛幹嘛不就搞定了嗎?這個...
我希望我的Clone能不去判斷每種具體的類型,而盡量使用JavaScript語言提供的機制來完成,這也是上次那個Clone方法不能Clone值類型的原因。
objClone = new this.constructor(this.valueOf());
代替我原來的:
objClone = new this.constructor();
對于 date, boolean, number 這三種基本的資料類型,執行
var objClone = new this.constructor();
的時候,得到的是預設值。而真實的值又沒有屬性可引用到,是以,隻能在初始化的時候,以參數形式賦預設值。
var objClone = new this.constructor(this.valueOf());
不過後來麻袋發現它的代碼處理Object的時候有問題,于是給出了:
var objClone;
if ( this.constructor == Object )
objClone = new this.constructor();
else
objClone = new this.constructor(this.valueOf());
obj = new Object([value])
參數
obj
必選項。要指派為 Object 對象的變量名。
value
可選項。任意一種 JScript 基本資料類型。(Number、Boolean、或 String。)如果 value 為一個對象,傳回不作改動的該對象。如果 value 為 null、undefined,或者沒有給出,則産生沒有内容的對象。
上面紅字中的"對象",因該指的是:new Object()這樣的執行個體,用代碼來翻譯就是:
var obj = new Object();
obj.asdf = 'asdf';
obj2 = new Object(obj);
alert(obj===obj2);
結果是啥?true!
我在原來那個Clone的測試中,設計我的測試代碼的第一個資料類型時,出了點錯誤,我用Literal的文法方式寫的obj其實是Object的執行個體。本來我是想測試使用者定義類型,應該這麼弄:
function JSClass()
{
this.abc = 'abc';
this.faint = ['f', 'a', 'i', 'n', 't'];
this.toString = function()
{
return 'abc:' + this.abc + ', faint:[' + this.faint + ']';
};
}
var jsClass = new JSClass();
var classClone = jsClass.Clone();
var classClone2 = jsClass.Clone();
classClone2.abc = 'def';
for ( var i=0 ; i < classClone2.faint.length ; ++i ) classClone2.faint[i] = '-';
Render('JSclass', jsClass, classClone, classClone2, true);
這個JSClass也是适合使用new this.consturctor(this.valueOf())這種方式來Clone,這時的參數不會影響它生成的對象的。
結合麻袋的修改,相容版的JavaScript Clone方法出來了
:
// Authors Birdshome, 麻袋@部落格園
Object.prototype.Clone = function()
{
var objClone;
if ( this.constructor == Object ) objClone = new this.constructor();
else objClone = new this.constructor(this.valueOf());
for ( var key in this )
{
if ( objClone[key] != this[key] )
{
if ( typeof(this[key]) == 'object' )
{
objClone[key] = this[key].Clone();
}
else
{
objClone[key] = this[key];
}
}
objClone.toString = this.toString;
objClone.valueOf = this.valueOf;
return objClone;
}
至于需要不要把Object的預設方法都copy一遍,我也說不清楚,就暫時copy這兩個最容易被重寫的吧,不然要列一大排地說。
測試結果附圖:
測試代碼:
<script language="javascript">
</script>
本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。