JavaScript 原型導向設計繼承模式
利用prototype來實踐javascript繼承模式
我們可以利用上面所提到的prototype chain來實踐多層祖孫繼承的模式,我們用範例來解釋一下這點:
// 哺乳綱
function Mammals() {
this.blood = "warm";
}
// 靈長目
function Primate() {
this.tail = true;
this.skin = "hairy";
}
Primate.prototype = new Mammals();
// 人科
function Homo() {
this.skin = "smooth";
}
Homo.prototype = new Primate();
var human = new Homo();
human.name = "Kevin";
alert(human.name); // "Kevin", from self
alert(human.skin); // "smooth", from Homo
alert(human.tail); // "true", from Primate
alert(human.blood); // "warm", from Mammals
javascript是個很活的語言,除了prototype的實踐方式以外,我們也可以使用別的方式來實現繼承:
// 哺乳綱
function Mammals() {
this.blood = "warm";
}
// 靈長目
function Primate() {
Mammals.call(this); // 記得放前面,不然會蓋掉重複的屬性
this.tail = true;
this.skin = "hairy";
}
Primate.prototype = new Mammals();
// 人科
function Homo() {
Primate.call(this); // 記得放前面,不然會蓋掉重複的屬性
this.skin = "smooth";
}
var human = new Homo();
human.name = "Kevin";
alert(human.name); // "Kevin", from self
alert(human.skin); // "smooth", from Homo
alert(human.tail); // "true", from Primate
alert(human.blood); // "warm", from Mammals
這種方式是將父類別的建構函式放在子類別的建構函式中以「this」的身分來執行,為自己建置父類別的屬性。這樣的作法有個好處,就是不會因為不當的操作,改動到別的物件的屬性,但是相對的也失去了共用屬性的便利性。
這種方式也能讓我們很方便的實作多重繼承,只要在子類別的建構函數中呼叫多個父類別的建構函式即可。
我們可以利用上面所提到的prototype chain來實踐多層祖孫繼承的模式,我們用範例來解釋一下這點:
// 哺乳綱
function Mammals() {
this.blood = "warm";
}
// 靈長目
function Primate() {
this.tail = true;
this.skin = "hairy";
}
Primate.prototype = new Mammals();
// 人科
function Homo() {
this.skin = "smooth";
}
Homo.prototype = new Primate();
var human = new Homo();
human.name = "Kevin";
alert(human.name); // "Kevin", from self
alert(human.skin); // "smooth", from Homo
alert(human.tail); // "true", from Primate
alert(human.blood); // "warm", from Mammals
javascript是個很活的語言,除了prototype的實踐方式以外,我們也可以使用別的方式來實現繼承:
// 哺乳綱
function Mammals() {
this.blood = "warm";
}
// 靈長目
function Primate() {
Mammals.call(this); // 記得放前面,不然會蓋掉重複的屬性
this.tail = true;
this.skin = "hairy";
}
Primate.prototype = new Mammals();
// 人科
function Homo() {
Primate.call(this); // 記得放前面,不然會蓋掉重複的屬性
this.skin = "smooth";
}
var human = new Homo();
human.name = "Kevin";
alert(human.name); // "Kevin", from self
alert(human.skin); // "smooth", from Homo
alert(human.tail); // "true", from Primate
alert(human.blood); // "warm", from Mammals
這種方式是將父類別的建構函式放在子類別的建構函式中以「this」的身分來執行,為自己建置父類別的屬性。這樣的作法有個好處,就是不會因為不當的操作,改動到別的物件的屬性,但是相對的也失去了共用屬性的便利性。
這種方式也能讓我們很方便的實作多重繼承,只要在子類別的建構函數中呼叫多個父類別的建構函式即可。
留言
張貼留言