摘要:父類子類原理就是改變中的指向,指向的實(shí)例,子類會(huì)獲得父類的私有屬性和方法原型鏈繼承在中通過(guò)繼承到了父類的私有屬性和私有方法。子類私有繼承父類私有原理目前比較常用的是混合繼承和混合繼承,子類能很清晰的繼承父類的公有和私有。
前言:JS之理解原型和原型鏈,幾種常見(jiàn)的繼承方式介紹
1.call繼承,也叫借用構(gòu)造函數(shù)、偽造對(duì)象或是經(jīng)典繼承。call繼承回把父類的私有屬性和方法繼承給子類私有;父類公有屬性(原型上的屬性)無(wú)關(guān)。當(dāng)然這里的call也可以用apply。
//父類F //子類S function S(){ F.call(this) }//原理就是改變F中的this指向,指向S的實(shí)例,子類會(huì)獲得父類F的私有屬性和方法
2.原型鏈繼承:在1中通過(guò)call繼承到了父類的私有屬性和私有方法。下一步就是有共有屬性和方法。原型鏈繼承把父類私有和公有的屬性,都給了子類公有,子類的原型作為父類的實(shí)例。原型鏈繼承會(huì)使得父類的私有屬性在子類的私有和公有都得到繼承。
function S(){}; //把子類公有的作為父類的實(shí)例; S.prototype=new F; let s=new S;
3.冒充繼承:通過(guò)遍歷父類的屬性,把父類私有+公有的的屬性都給了子類私有。for in循環(huán),只能遍歷自定義的屬性和方法;拿不到系統(tǒng)的屬性和方法,例如constructor;
function S(){ for(var attr in f){ this[attr]=f[attr];}} let s=new S;
4.混合繼承1:call繼承+原型鏈繼承;子類私有中有父類私有的,子類公有也有父類私有;;
//子類私有繼承父類私有; function S(){ F.call(this)}; //子類公有繼承父類私有——公有 S.prototype=new F; let s=new S;
5.混合繼承2:call繼承+拷貝繼承(extend),通過(guò)extend方法遍歷父類原型上的方法,并復(fù)制給子類的原型。
//子類私有繼承父類私有; function S(){F.call(this);} //通過(guò)extend方法進(jìn)行拷貝繼承公有 extend(S.prototype, F.prototype); let s=new S; //extend方法 function extend(obj2,obj1){ for(var attr in obj1){ obj2[attr]=obj1[attr]}
6.混合繼承3:call繼承+Object.create(),這也是ES6里class繼承extends的原理,點(diǎn)這。
//子類私有繼承父類私有; function S(){F.call(this)} S.prototype = Object.create(F.prototype,{constructor:{value:S}}) //Object.create()原理 function Tmp(){}; Tmp.prototype= F.prototype; S.prototype=new Tmp; S.prototype.constructor=S; //********* let s=new S;
目前比較常用的是混合繼承2和混合繼承3,子類能很清晰的繼承父類的公有和私有。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84596.html
摘要:理解繼承在中對(duì)繼承有了更友好的方式。總的來(lái)說(shuō)的的實(shí)質(zhì)和以前的繼承方式是一致的,但是有了更好的,更清晰的表現(xiàn)形式。 理解ES6繼承extends 1.在es6中對(duì)繼承有了更友好的方式。在下面的繼承中那到底在extends的時(shí)候做了什么,super()又是代表什么意思。 class People{ constructor(name, age) { this.name = name; ...
摘要:通常有這兩種繼承方式接口繼承和實(shí)現(xiàn)繼承。理解繼承的工作是通過(guò)調(diào)用函數(shù)實(shí)現(xiàn)的,所以是寄生,將繼承工作寄托給別人做,自己只是做增強(qiáng)工作。適用基于某個(gè)對(duì)象或某些信息來(lái)創(chuàng)建對(duì)象,而不考慮自定義類型和構(gòu)造函數(shù)。 一、繼承的概念 繼承,是面向?qū)ο笳Z(yǔ)言的一個(gè)重要概念。通常有這兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。 《JS高程》里提到:由于函數(shù)沒(méi)有簽名,...
摘要:原型鏈與繼承當(dāng)談到繼承時(shí),只有一種結(jié)構(gòu)對(duì)象。如果對(duì)該圖不怎么理解,不要著急,繼續(xù)往下看基于原型鏈的繼承對(duì)象是動(dòng)態(tài)的屬性包指其自己的屬性。當(dāng)使用操作符來(lái)作用這個(gè)函數(shù)時(shí),它就可以被稱為構(gòu)造方法構(gòu)造函數(shù)。 原型鏈與繼承 當(dāng)談到繼承時(shí),JavaScript 只有一種結(jié)構(gòu):對(duì)象。每個(gè)實(shí)例對(duì)象(object )都有一個(gè)私有屬性(稱之為proto)指向它的原型對(duì)象(prototype)。該原型對(duì)象也...
摘要:繼承繼承子類可以使用父類的所有功能,并且對(duì)這些功能進(jìn)行擴(kuò)展。類繼承父類父類添加共有方法子類繼承父類子類添加共有方法其中最核心的一句代碼是將原型指向了父類的原型對(duì)象。 繼承 繼承:子類可以使用父類的所有功能,并且對(duì)這些功能進(jìn)行擴(kuò)展。繼承的過(guò)程,就是從一般到特殊的過(guò)程。 類繼承 // 父類 var supperClass = function() { var id = 1; thi...
摘要:中的繼承有多少種方式去某度搜一下,說(shuō)幾種的都有,看的頭暈眼花,還是云里霧里,于是就自己認(rèn)真理一下,寫一篇按照自己的理解來(lái)進(jìn)行的分類。 js中的繼承有多少種方式?去某度搜一下,說(shuō)幾種的都有,看的頭暈眼花,還是云里霧里,于是就自己認(rèn)真理一下,寫一篇按照自己的理解來(lái)進(jìn)行的分類。 JS實(shí)現(xiàn)繼承的核心技術(shù)點(diǎn)無(wú)非幾種: 1: new 關(guān)鍵字 2: prototype 3: call、appl...
閱讀 2339·2023-04-25 14:29
閱讀 1464·2021-11-22 09:34
閱讀 2707·2021-11-22 09:34
閱讀 3394·2021-11-11 10:59
閱讀 1856·2021-09-26 09:46
閱讀 2227·2021-09-22 16:03
閱讀 1925·2019-08-30 12:56
閱讀 482·2019-08-30 11:12