JavaScript學習總結(十四)——JavaScript編寫類的擴展方法


  在​J​a​v​a​S​c​r​i​p​t​中​可以使​用​類的p​r​o​t​o​t​y​p​e屬性來​擴​展​類的屬​性​和​方​法,在實際開發當中,當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的源碼,過段時間再和大家分享我的心得吧!文章中如果有寫得不對的地方,歡迎朋友們指正,感激不盡!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM