js幾種繼承方式

注意:

1,constructor總是指向類的構(gòu)造函數(shù)

2,__proto__指向父類的原型對(duì)象

1臣樱,原型鏈繼承


function Father(name){

    this.name=name;

    this.color=['red','blue'];

}

Father.prototype.getName=function(){

    console.log(this.name)

}

function Child(){}

Child.prototype = new Father();

Child.prototype.constructor = Child;

var son1 = new Child('ming');

var son2 = new Child('wei');

son1.color.push('white');

son2.color; //['red','blue','white']

缺點(diǎn):對(duì)于復(fù)雜數(shù)據(jù)類型color,多個(gè)實(shí)例對(duì)引用的操作會(huì)被篡改

2,借用構(gòu)造函數(shù)繼承


function Father(name){

    this.name=name;

}

Father.prototype.getName=function(){

    console.log(this.name)

}

function Son(name){

    Father.apply(this,arguments);

}

var son = new Son('ming');

console.log(son.getName())  // son.getName is not a function

缺點(diǎn):父類原型鏈上的屬性和方法無法獲取

3雇毫,組合繼承(偽經(jīng)典繼承)


function Father(name) {

    this.name = name;

    this.color=['red','blue'];

}

Father.prototype.getName = function() {

    console.log(this.name)

}

function Child(name) {

    Father.apply(this, arguments);

}

Child.prototype = new Father();

Child.prototype.constructor = Child;

var son = new Child('ming');

console.log(son.color);

son.color.push('white') 

var son2 = new Child('wei');

console.log(son2.color)    //['red','blue']

基本ok,除了new Father()那個(gè)地方會(huì)多寫一遍屬性和方法,差不多還行

4玄捕,原型式繼承(道爺-2006)


var Person={

    name:'ming',

    color:['red','blue']

}

function object(obj){

    function F(){};

    F.prototype=obj;

    return new F();

}

var son1 = object(Person);

var son2 = object(Person);

son1.name='wei';

son1.color = ['white'];

console.log(son2.color);  // ['red','blue','white']

缺點(diǎn)很明顯:

1,原型實(shí)例指向的引用相同,可能存在篡改

2,不能傳遞參數(shù)

另:object方法已經(jīng)由Object.create()實(shí)現(xiàn)

5棚放,寄生式繼承枚粘,(道爺有點(diǎn)皮)

創(chuàng)建一個(gè)函數(shù),在內(nèi)部構(gòu)造新的屬性和方法飘蚯,以增強(qiáng)對(duì)象(原型式繼承的加強(qiáng)版)


var Person = {

    name: 'ming',

    color: ['red', 'blue']

}

function object(obj) {

  function F() {};

      F.prototype = obj;

      return new F();

  }

  function createSon(obj){

      var son = object(obj);

      console.log(son)

      son.say=function(){

      console.log('Hello,'+this.name)

    }

 return son;

}

var son1 = createSon(Person);

console.log(son1.name)

缺點(diǎn)很明顯:

1,原型實(shí)例指向的引用相同馍迄,可能存在篡改

2,不能傳遞參數(shù)

6,寄生組合式繼承(借用構(gòu)造函數(shù)繼承+寄生式繼承)


function object(obj) {

    function F() {};

    F.prototype = obj;

    return new F();

}

function inheritPerson(Person,Son){

    var pro = object(Person.prototype);

    Son.prototype.constructor=Son;

    Son.prototype = pro;

}

function Person(name){

    this.name=name;

    this.color=['red','blue'];

}

Person.prototype.say=function(){

    console.log('Hello,'+this.name)

}

function Son(name,age){

    Person.call(this,name);

    this.age = age;

}

inheritPerson(Person,Son);

Son.prototype.getAge=function(){

    console.log(this.age);

}

var child1 = new Son('ming',20);

var child2 = new Son('wei',30);

child1.say()  // ming

child1.color.push('white');

console.log(child2.color)  //['red','blue']

這個(gè)是es5的終極解決方案

7局骤,混入方式繼承多個(gè)對(duì)象


function Father1(name){this.name=name}

function Father2(age){this.age=age}

function Son(name,age){

    Father1.call(this,name);

    Father2.call(this,age);

}

Son.prototype = Object.create(Father1.prototype);

Object.assign(Father1.prototype,Father2.prototype);

Son.prototype.constructor=Son;

var son1 = new Son('ming',20);

console.log(son1)

這個(gè)實(shí)際上是寄生組合式繼承的加強(qiáng)版

8.class繼承


class Person{

  constructor(name){

  this.name=name

  }

  say(){

  console.log(this.name)

  }

}

class Son extends Person{

  constructor(name){

    super(name)

    }

}

使用babel轉(zhuǎn)義為es5之后:


"use strict";

function _inheritsLoose(subClass, superClass) {

    subClass.prototype = Object.create(superClass.prototype); 

    subClass.prototype.constructor = subClass;

    subClass.__proto__ = superClass;

}

var Person =

function () {

  function Person(name) {

    this.name = name;

  }

  var _proto = Person.prototype;

  _proto.say = function say() {

    console.log(this.name);

  };

  return Person;

}();

var Son =

function (_Person) {

  _inheritsLoose(Son, _Person);

  function Son(name) {

    return _Person.call(this, name) || this;

  }

  return Son;

}(Person);

總結(jié):

1攀圈,類方法調(diào)用時(shí)不會(huì)變量提升:

var p = new P(); // Cannot access 'P' before initialization

class P{}

2,es6的繼承赘来,實(shí)際上是先創(chuàng)建父類的實(shí)例對(duì)象this凯傲,然后再用子類的構(gòu)造函數(shù)修改this,因此在子類的contructor中要調(diào)用父類的super()幌缝,否則要報(bào)錯(cuò)诫欠。

參考資料:

1,https://juejin.im/post/5bcb2e295188255c55472db0#heading-0

2缘厢,https://www.liaoxuefeng.com/wiki/1022910821149312/1023021997355072

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贴硫,一起剝皮案震驚了整個(gè)濱河市英遭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挖诸,老刑警劉巖多律,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辽装,居然都是意外死亡相味,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門拓巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玲销,“玉大人摘符,你說我怎么就攤上這事〈袢蓿” “怎么了带族?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阳堕。 經(jīng)常有香客問我择克,道長,這世上最難降的妖魔是什么壹堰? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任贱纠,我火速辦了婚禮响蕴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辖试。我一直安慰自己,他們只是感情好剃执,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布肾档。 她就那樣靜靜地躺著怒见,像睡著了一般姑宽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舵变,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天纪隙,我揣著相機(jī)與錄音扛或,去河邊找鬼。 笑死悲伶,一個(gè)胖子當(dāng)著我的面吹牛住涉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淮椰,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼主穗,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼毙芜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晦雨,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绑雄,沒想到半個(gè)月后奥邮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脚粟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年核无,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了团南。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼彪。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖佑惠,靈堂內(nèi)的尸體忽然破棺而出齐疙,到底是詐尸還是另有隱情,我是刑警寧澤赌厅,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布特愿,位于F島的核電站勾缭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俩由。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一兜畸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伐蒂,春花似錦肛鹏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佛纫。三九已至,卻和暖如春好爬,著一層夾襖步出監(jiān)牢的瞬間甥啄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工穆桂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留融虽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓般又,卻偏偏與公主長得像茴迁,于是被迫代替她去往敵國和親萤衰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容