在JavaScript中可以使用類的prototype屬性來擴展類的屬性和方法,在實際開發當中,當JavaScript內置的那些類所提供的動態方法和動態屬性不滿足我們實際開發時,我們就可以通過"prototype"屬性給自定義類添加方法和屬性或者擴展原有的類中的方法和屬性。
一、擴展JavaScript內置類,添加動態方法
語法格式:
類名.prototype.方法名 = function([param1],[param2],....[paramn]) {
.................
}
[param1],[param2],....[paramn]這些參數都是可選的
使用這種方式給類添加的擴展方法都是動態的,動態方法是針對類的實例對象的,所以調用必須要用"對象.方法名"的形式去調用,不能用"類名.方法名"的形式去調用!
1.1、使用prototype屬性擴展String類
String類是JavaScript內置的一個類,但是這個String類沒有quote方法,此時就可以使用String類的prototype屬性去擴展String類了,為String類添加一個實例方法(動態方法),這樣每一個String類對象就都有quote方法了,這就達到了將String類擴展的效果,增強了String類的使用。
1 /*擴展為String類,為String類增加quote(兩邊加字符)方法*/ 2 String.prototype.quote = function(quotestr) { 3 if (!quotestr) { 4 quotestr = "\""; 5 } 6 return quotestr + this + quotestr; 7 };
測試String類新添加的quote方法
1 alert("abc".quote()); 2 alert("abc".quote("|"));
測試結果:
1.2、使用prototype擴展Number類
1 Number.prototype.add=function(n){ 2 //哪個對象調用this所在的函數,那么this代表的就是哪個對象實例 3 return this+n; 4 }
測試Number類新添加的add方法
1 var i= new Number(10);//等價於var i=10; 2 alert("i.Add(10).Add(30)的結果是:"+i.Add(10).Add(30)); 3 var b=40; 4 alert("b.Add(90)的結果是:"+b.Add(90));
測試結果:
1.3、使用prototype擴展Array類
1 Array.prototype.findVal=function(val){ 2 var index=-1; 3 //哪個對象調用this所在的函數,那么this代表的就是哪個對象實例 4 for(var i=0;i<this.length;i++){ 5 if(val==this[i]){ 6 index=i; 7 break; 8 } 9 } 10 return index; 11 }
測試Array類新添加的findVal方法
1 var arr = new Array(); 2 arr[0]="孤傲蒼狼"; 3 arr[1]="白虎神皇"; 4 arr[2]="滅世魔尊"; 5 alert("arr.FindVal(\"白虎神皇\")返回的索引是:"+arr.FindVal("白虎神皇"));
測試結果:
以上三個小例子就是使用類的prototype屬性擴展了String類,Number類,Array類,分別給這三個類添加了本身不存在的quote,add,findVal方法,JavaScript所有的類都可以使用prototype去擴展,當覺得類本身提供的方法和屬性不滿足實際應用需求時,就可以根據需要進行擴展,為類添加新的方法和屬性,增強類的使用功能!
二、擴展JavaScript內置類,添加靜態方法
JavaScript是可以給類添加靜態的擴展方法的,語法格式如下:
類名.方法名 = function([param1],[param2],....[paramn]) {
.................
}
[param1],[param2],....[paramn]這些參數都是可選的
使用這種方式給類添加的擴展方法都是靜態的,動態方法是針對類的實例對象的,所以調用必須要用"對象.方法名"的形式去調用,而靜態方法是針對類的,用"類名.方法名"的形式去調用!
C#中的String類有一個靜態的Format方法非常強大,在拼接字符串時特別方便,JavaScript的String類並沒有Format方法,但是我們可以去擴展String類,為String類添加類似C#中的String類的靜態的Format方法
范例:擴展String類,添加Format靜態方法,模仿C#中的String.Format方法
1 // ---------------------------------------------------------------------- 2 // <summary> 3 // 擴展String類,添加Format靜態方法,模仿C#中的String.Format方法 4 // </summary> 5 // <returns>str</returns> 6 // ---------------------------------------------------------------------- 7 if (!String.Format) { 8 String.Format = function () { 9 if (arguments.length == 0) { 10 return null; 11 } 12 var str = arguments[0]; 13 if (arguments[1] instanceof Array) { 14 var arr = arguments[1]; 15 for (var i = 0; i < arr.length; i++) { 16 var re = new RegExp('\\{' + i + '\\}', 'gm'); 17 str = str.replace(re, arr[i]); 18 } 19 } else { 20 for (var i = 1; i < arguments.length; i++) { 21 var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm'); 22 str = str.replace(re, arguments[i]); 23 24 } 25 } 26 return str; 27 } 28 }
測試為String類擴展的Format靜態方法
1 var str="我是{0},我在總結{1}和{2}的學習,我很喜歡{3}這2門語言!"; 2 //使用"類名.方法名"的形式去調用類的靜態方法 3 str = String.Format(str,"孤傲蒼狼","java","JavaScript","'java'和'JavaScript'");//把str中的占位符{0},{1},{2},{3}用具體的內容替換掉 4 alert(str);
運行結果:
這個小例子就是擴展了String類,給String類添加了一個靜態的Format方法,JavaScript所有的類都可以添加靜態擴展方法,當覺得類本身提供的靜態方法和靜態屬性不滿足實際應用需求時,就可以根據需要進行擴展,為類添加新的靜態方法和靜態屬性,增強類的使用功能!
以上就是對JavaScript編寫類的擴展方法的總結,大家可以根據實際情況對JavaScript內置的那些類編寫擴展方法,滿足在開發中實際需求!有一個比較著名的prototype.js庫就是針對JavaScript內置的那些類進行擴展,編寫了大量的擴展方法!學習編寫JavaScript擴展方法時,可以去多多參考prototype.js的寫法,我本人現在也在看prototype.js的源碼,過段時間再和大家分享我的心得吧!文章中如果有寫得不對的地方,歡迎朋友們指正,感激不盡!