JScript中物件的expando屬性是對Object,Array等引用型別增加成員的重要手段,但這種手段在對值型時就不行了,例如
var str = "string1";
str.method1 = function(){
//do something
};
str.method1();//這裡將出錯,錯誤訊息(我忘記了)是說str不存在該方法
這樣的語句就會運行不了,而在C#程式設計中值類型存在裝箱與拆箱操作來將其轉換為引用類型,對此,JScript中也存在值類型,我們也可以做個類似操作,其實現如下,其中toJSON()的操作見這裡,其作用是將對象(泛指)用字符字串表示出來,以便使用eval函數還原該物件。
Boolean.prototype.box = function(){
return new Boolean( this );
};
Number.prototype.box = function(){
return new Number( this );
};
String.prototype.box = function(){
return new String( this );
};
Boolean.prototype.unbox = function(){
return eval( this.toJSON() );
};
Number.prototype.unbox = function(){
return eval( this.toJSON() );
};
String.prototype.unbox = function(){
return eval( this.toJSON() );
};box即為裝箱,unbox即為拆箱。測試程式碼如下:
str = true.box();
alert( str );
str = str.unbox();
alert( str );至此,我們JScript也有了裝箱操作,這有什麼好處呢?再看看開頭那段語句吧,此時我們就可以像對待Object一樣對待String,Boolean,Number這三種值類型,就可以在運行時為值類型的變數增加expando屬性,這樣是不是很方便呢?
而拆箱操作也很簡單,只要呼叫類似str.unbox()就搞定。