- 在es5中要實(shí)現(xiàn)繼承汞舱,需要兩個(gè)關(guān)鍵步驟:
①去繼承構(gòu)造函數(shù)中的成員,
②去繼承原型對(duì)象上的成員隆夯。
- 對(duì)于去繼承構(gòu)造函數(shù)中的成員钳恕,我們可以借助apply或call方法,唯一的區(qū)別就是參數(shù)的不同蹄衷,一個(gè)是數(shù)組忧额,一個(gè)是單個(gè)傳入。
1.父類(我們把方法定義在父類上宦芦,
這會(huì)造成宙址,每次new實(shí)例的時(shí)候就會(huì)創(chuàng)建一個(gè)run方法,
放到原型對(duì)象上调卑,就會(huì)去原型對(duì)象上找)
function Animal(name, age){
this.age = age;
this.name = name;
this.run = function () {
console.log('run');
}
}
2.創(chuàng)建一個(gè)Dog子類
function Dog(name, age){
Animal.call(this, name, age);
}
3. 缺點(diǎn):每次new一個(gè)dog實(shí)例抡砂,都需要調(diào)用Animal,效率下降
- 去繼承原型對(duì)象中的方法
關(guān)鍵代碼:Dog.prototype = Animal.prototype
1. 通過這行代碼我們可以去實(shí)現(xiàn)原型對(duì)象上的繼承恬涧,
但是有一個(gè)缺點(diǎn)注益,就是無法實(shí)現(xiàn)個(gè)性化的繼承。
也就是說如果我們往Dog.prototype上加一個(gè)成員溯捆,那么Animal的prototype上也會(huì)存在丑搔。
- 如果我們還是想實(shí)現(xiàn)Dog.prototype上添加而Animal上面不增加,應(yīng)該如何做呢提揍?
需要借助一個(gè)中間夾層
function F(){}
F.prototype = Animal.prototype;
Dog.prototype = new F();
1:創(chuàng)建了一個(gè)新的構(gòu)造函數(shù)F,讓F的原型對(duì)象指向Animal的原型對(duì)象啤月,然后讓Dog的原型對(duì)象等于F的實(shí)例對(duì)象,因?yàn)镕的實(shí)例對(duì)象擁有F.prototype的成員劳跃,即用于Animal.prototype的成員谎仲。
https://blog.csdn.net/Bermida/article/details/116892568