關於繼承和原型鏈

繼承

繼承是父對象的成員,子對象不用重複創建,也可以直接使用 這樣就可以節約內存,代碼重用。那我們什麼時候使用繼承呢?只要一類子對象,都需要相同的甦醒或功能時,只要將相同的屬性和功能僅在父對象中定義一次即可。那我們怎麼使用呢, js中的繼承都是繼承原型對象。原型對象又是什麼呢?它是專門集中存儲一類子對象相同屬性和功能的父對象 同一類子對象所共有的屬性或方法。那我們怎麼定義?在我們創建構造函數的時候,構造函數會自動贈送一個原型對象。如何在原型對象中添加屬性呢?例子如下:Student.prototype.className = ‘大一三班’;。關於原型對象中的方法和屬性的訪問 ,他其實和構造函數的方法是一樣使用的。我們是怎麼在兩種類型中繼承的呢?第一步:定義父類型;第二步:讓子類型原型對象繼承父類型原型對象;第三步:在子類構造函數中借用父類型構造函數(達到請父類型構造函數幫忙初始化屬性結構)。這裏有我自己做的一個例子:
有獅子、斑馬、鯊魚、海豚四類動物,他們都有年齡、體重這些信息,並且繁殖後代的方式都是胎生,但是生活方式卻有所不同,獅子和斑馬在陸地上生活,屬於陸生動物,並且他們的撲食方式又不同,獅子靠捕捉其他小動物爲生,而斑馬靠食草爲生,鯊魚和海豚在水下生活,屬於水生動物。請在確保代碼的擴展性和較少冗餘的情況下構造函數和原型
function Animal(name,age,height,breed){
this.name = name;
this.age = age;
this.height = height;
this.breed = breed;
}
Animal.prototype.lifeStyle = function(){
console.log(${this.name}在陸地上生活,屬於陸生動物);
}
Animal.prototype.modeofLife = function(){
console.log(${this.name}在水下生活,屬於水生動物);
}
function Lion(name,age,height,breed){
Animal.call(this,name,age,height,breed);
this.predation = function(){
console.log(${this.name}靠捕捉其他小動物爲生)
}
}
Object.setPrototypeOf(Lion.prototype,Animal.prototype);
function Zebra(name,age,height,breed){
Animal.call(this,name,age,height,breed);
this.prayOn = function(){
console.log(${this.name}靠食草爲生)
}
}
Object.setPrototypeOf(Zebra.prototype,Animal.prototype);
function Shark(name,age,height,breed){
Animal.call(this,name,age,height,breed);
}
Object.setPrototypeOf(Shark.prototype,Animal.prototype);
function Dolphin(name,age,height,breed){
Animal.call(this,name,age,height,breed);
}
Object.setPrototypeOf(Dolphin.prototype,Animal.prototype);

var shizi = new Lion("獅子",3,100,"胎生");
shizi.lifeStyle();
shizi.predation();
var banma = new Zebra("斑馬",3,100,"胎生");
banma.lifeStyle();
banma.prayOn();
var shayu = new Shark("鯊魚",3,100,"胎生");
shayu.modeofLife();
var haitun = new Dolphin("海豚",3,100,"胎生");
haitun.modeofLife();

原型鏈

首先因爲原型本身也是個對象,因此原型對象也有原型,而原型鏈是由多級父元素逐級繼承形成的鏈式結構。那麼還有作用域鏈,這兩個的區別是:原型鏈保存着所有對象的成員,而作用域鏈保存所有的變量。原型鏈的作用是控制對象訪問成員的使用順序:優先使用自己的,自己沒有,才延原型鏈向父級查找。而作用域鏈的作用是控制變量的使用順序:優先使用活動對象(AO)中的局部變量,局部中沒有,纔去延用作用域鏈向父級作用域查找。原型鏈的最頂端是Object.prototype。而作用域鏈的最頂端是window。那麼我們簡單的來概括這兩個的區別,就是所有不需要"對象."訪問的變量都保存在作用域鏈中,而所有需要用"對象."訪問的變量都保存在原型鏈中。 最後,我們是怎麼驗證原型對象的呢,我這裏有一個例子:
Object.getPrototypeOf(obj) == Array.prototype;
console.log(
Object.getPrototypeOf(obj1) == Array.prototype,
Object.getPrototypeOf(obj2) == Array.prototype

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章