這篇開始寫幾個工具函數實作類別的擴充。每個工具函數都是針對特定的寫類方式(習慣)。這篇按照建構函式方式寫類:屬性(欄位)和方法都掛在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