JavaScript 繼承方式(2)
這篇開始寫幾個工具函數實現類的擴展。每個工具函數都是針對特定的寫類方式(習慣)。這篇按照構造函數方式寫類:屬性(字段)和方法都掛在this上。以下分別提供了個類,分別作為父類和子類。
//父類Person
function Person(nationality) {
this.nationality = nationality;
this.setNationality = function(n) {this.nationality=n;};
this.getNationality = function() {return this.nationality;};
}
//類Man
function Man(name) {
this.name = name;
this.setName = function(n){this.name=n;};
this.getName = function(){return this.name;};
}
function Person(nationality) {
this.nationality = nationality;
this.setNationality = function(n) {this.nationality=n;};
this.getNationality = function() {return this.nationality;};
}
//類Man
function Man(name) {
this.name = name;
this.setName = function(n){this.name=n;};
this.getName = function(){return this.name;};
}
1,繼承工具函數一
/**
* @param {Function} subCls 子類
* @param {Function} superCls 父類
* @param {Object} param 父類構造參數
*/
function extend(subCls,superCls,param) {
superCls.call(subCls.prototype,param);
}
* @param {Function} subCls 子類
* @param {Function} superCls 父類
* @param {Object} param 父類構造參數
*/
function extend(subCls,superCls,param) {
superCls.call(subCls.prototype,param);
}
使用如下:
extend(Man,Person,'China');
var m = new Man('jack');
console.log(m.nationality);//China
console.log(m.setNationality('Japan'));
console.log(m.getNationality('Japan'));//Japan
var m = new Man('jack');
console.log(m.nationality);//China
console.log(m.setNationality('Japan'));
console.log(m.getNationality('Japan'));//Japan
輸出可以看到Man繼承了Person的屬性及所有方法。這種繼承方式于java的很不一樣哦:
class Animal {
int legs;
Animal(int l) {
legs = l;
}
int getLegs() {
return legs;
}
}
public class Person extends Animal{
//屬性(字段)
String name;
//構造方法(函數)
Person(int legs, String name) {
super(legs);//調用父類構造器
this.name = name;
}
//方法
String getName() {
return this.name;
}
public static void main(String[] args) {
Person p = new Person(2,"jack");
System.out.println(p.legs);
}
}
int legs;
Animal(int l) {
legs = l;
}
int getLegs() {
return legs;
}
}
public class Person extends Animal{
//屬性(字段)
String name;
//構造方法(函數)
Person(int legs, String name) {
super(legs);//調用父類構造器
this.name = name;
}
//方法
String getName() {
return this.name;
}
public static void main(String[] args) {
Person p = new Person(2,"jack");
System.out.println(p.legs);
}
}
Java中,子類Person在自身構造方法中調用父類構造方法super(legs),創建對象的時候直接將父類構造參數legs:2傳進去,不僅僅只傳自己的name:jack。上面JavaScript繼承是在extend時傳父類構造參數(extend函數的第三個參數),而不是在new Man時將父類構造參數傳過去。好,模擬Java來實現下extend,這里巧妙的在子類上暫存了父類引用。
2,繼承工具函數二
/**
* @param {Function} subCls
* @param {Function} superCls
*/
function extend(subCls,superCls) {
subCls.supr = superCls;
}
* @param {Function} subCls
* @param {Function} superCls
*/
function extend(subCls,superCls) {
subCls.supr = superCls;
}
還是以Person為父類,來實現子類Woma:
function Woman(nationality,name) {
Woman.supr.call(this,nationality);//和java有點類似哦,在子類中調用父類構造器
this.name = name;
this.setName = function(n){this.name=n;};
this.getName = function(){return this.name;};
}
extend(Woman,Person);
Woman.supr.call(this,nationality);//和java有點類似哦,在子類中調用父類構造器
this.name = name;
this.setName = function(n){this.name=n;};
this.getName = function(){return this.name;};
}
extend(Woman,Person);
最后,創建對象的方式和java也類似,即new的時候同時將父類構造參數(nationality:Japan)傳進去。
var w = new Woman('Japan','lily');
console.log(w.nationality);//Japan
w.setNationality('U.S.A');
console.log(w.getNationality());//U.S.A
console.log(w.nationality);//Japan
w.setNationality('U.S.A');
console.log(w.getNationality());//U.S.A
全站熱搜