JavaScript繼承方式(2)

來源:互聯網
上載者:User

這篇開始寫幾個工具函數實作類別的擴充。每個工具函數都是針對特定的寫類方式(習慣)。這篇按照建構函式方式寫類:屬性(欄位)和方法都掛在this上。以下分別提供了個類,分別作為父類和子類。

view sourceprint?01 //  父類Person 

02 function Person(nationality) { 

03     this.nationality = nationality; 

04     this.setNationality = function(n) {this.nationality=n;}; 

05     this.getNationality = function() {return this.nationality;}; 

06 } 

07   

08 // 類Man 

09 function Man(name) { 

10     this.name = name; 

11     this.setName = function(n){this.name=n;}; 

12     this.getName = function(){return this.name;}; 

13 }

 

1,繼承工具函數一


view sourceprint?1 /** 

2  * @param {Function} subCls 子類 

3  * @param {Function} superCls 父類 

4  * @param {Object} param 父類構造參數 

5  */

6 function extend(subCls,superCls,param) { 

7     superCls.call(subCls.prototype,param); 

8 }

使用如下

view sourceprint?1 extend(Man,Person,China); 

2 var m = new Man(jack); 

3 console.log(m.nationality);//China 

4 console.log(m.setNationality(Japan)); 

5 console.log(m.getNationality(Japan));//Japan

輸出可以看到Man繼承了Person的屬性及所有方法。這種繼承方式於java的很不一樣哦,

view sourceprint?01 class Animal { 

02     int legs;    

03     Animal(int l) { 

04         legs = l; 

05     } 

06     int getLegs() { 

07         return legs; 

08     } 

09 } 

10 public class Person extends Animal{ 

11     //屬性(欄位) 

12     String name;     

13     //構造方法(函數) 

14     Person(int legs, String name) { 

15         super(legs);//調用父類構造器 

16         this.name = name; 

17     }    

18     //方法 

19     String getName() { 

20         return this.name; 

21     } 

22     public static void main(String[] args) { 

23           

24         Person p = new Person(2,"jack");         

25         System.out.println(p.legs); 

26     } 

27 }

Java中,子類Person在自身構造方法中調用父類構造方法super(legs),建立對象的時候直接將父類構造參數legs:2傳進去,不僅僅只傳自己的name:jack。上面JavaScript繼承是在extend時傳父類構造參數(extend函數的第三個參數),而不是在new Man時將父類構造參數傳過去。好,類比Java來實現下extend,這裡巧妙的在子類上暫存了父類引用。

 

2,繼承工具函數二

view sourceprint?1 /** 

2  * @param {Function} subCls 

3  * @param {Function} superCls 

4  */

5 function extend(subCls,superCls) {   

6     subCls.supr = superCls; 

7 }

還是以Person為父類,來實現子類Woman

view sourceprint?1 function Woman(nationality,name) { 

2     Woman.supr.call(this,nationality);//和java有點類似哦,在子類中調用父類構造器 

3     this.name = name; 

4     this.setName = function(n){this.name=n;}; 

5     this.getName = function(){return this.name;}; 

6 }<BR>extend(Woman,Person);<BR>

最後,建立對象的方式和java也類似,即new的時候同時將父類構造參數(nationality:Japan)傳進去。

view sourceprint?1 var w = new Woman(Japan,lily); 

2 console.log(w.nationality);//Japan 

3 w.setNationality(U.S.A); 

4 console.log(w.getNationality());//U.S.A

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.