• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    全面分析JavaScript 繼承

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:55:48
    文檔

    全面分析JavaScript 繼承

    全面分析JavaScript 繼承:ES6之前,JavaScript并沒有繼承這一現(xiàn)有的機(jī)制。 ES5的繼承方式 類式繼承 //聲明父類 function Father(){ this.fatherVal = 'father'; } //為父類添加共有方法 Father.prototype.getFatherValue = function(){
    推薦度:
    導(dǎo)讀全面分析JavaScript 繼承:ES6之前,JavaScript并沒有繼承這一現(xiàn)有的機(jī)制。 ES5的繼承方式 類式繼承 //聲明父類 function Father(){ this.fatherVal = 'father'; } //為父類添加共有方法 Father.prototype.getFatherValue = function(){

    ES6之前,JavaScript并沒有繼承這一現(xiàn)有的機(jī)制。

    ES5的繼承方式

    類式繼承

    //聲明父類
    function Father(){
    this.fatherVal = 'father';
    }
    //為父類添加共有方法
    Father.prototype.getFatherValue = function(){
    return this.fatherVal;
    }
    //聲明子類 
    function Child(){
    this.childVal = 'child';
    }
    //繼承父類
    Child.prototype = new Father();
    //為子類添加共有方法
    Child.prototype.getChildValue = function(){
    return this.childVal;
    }
    
    
    

    子類的prototype被賦予父類的實(shí)例,新創(chuàng)建的對象復(fù)制了父類的構(gòu)造函數(shù)內(nèi)的屬性和方法并且將原型_proto_指向了父類的原型對象,這樣就擁有了父類的原型對象上的屬性和方法與父類構(gòu)造函數(shù)中復(fù)制的屬性和方法。

    var instance = new Child();
    console.log(instance.getFatherValue()); //father
    console.log(instance.getChildValue()); //child
    console.log(instance instanceof Child); //true
    console.log(instance instanceof Father); //true
    console.log(instance instanceof Object); //true
    console.log(Child instanceof Father); //false
    console.log(Child.prototype instanceof Father); //true
    
    
    

    缺點(diǎn):

    1.子類實(shí)例共用父類的公有引用屬性。

    2.無法對父類構(gòu)造函數(shù)內(nèi)的屬性進(jìn)行傳參初始化。

    function Father(){
    this.companies =['bigo','yy','uc']
    }
    funtion Child(){}
    Child.prototype = new Father();
    var instanceA = new Child();
    var instanceB = new Child();
    console.log(instanceB.companies); //['bigo','yy','uc']
    instanceA.companies.push('nemo');
    console.log(instanceB.companies); //['bigo','yy','uc','nemo']

    構(gòu)造函數(shù)繼承

    //聲明父類
    function Father(val){
    this.companies =['bigo','yy','uc']
    this.val = val;
    }
    //聲明父類原型方法
    Father.prototype.getCom = function(){
    console.log(this.companies);
    }
    //聲明子類
    function Child(val){
    //繼承
    Father.call(this,val);
    }
    var instanceA = new Child('childA');
    var instanceB = new Child('childB');
    instanceA.companies.push('nemo');
    console.log(instanceA.companies); //['bigo','yy','uc','nemo']
    console.log(instanceA.val); //childA
    console.log(instanceB.companies); //['bigo','yy','uc']
    console.log(instanceB.val); //childB
    

    對Child調(diào)用call,將子類中的變量在父類中執(zhí)行一遍,然后父類給this綁定,所以子類繼承了父類的公有屬性。

    缺點(diǎn):

    由于這種類型的繼承沒有設(shè)計(jì)原型prototype,所以父類的原型方法不會被子類繼承,而如果想被子類繼承就必須放在構(gòu)造函數(shù)中,這樣創(chuàng)建出來的每個(gè)實(shí)例都會單獨(dú)擁有一份而不能共用。

    組合繼承

    //聲明父類
    function Father(val){
    this.companies =['bigo','yy','uc']
    this.val = val;
    }
    //聲明父類原型方法
    Father.prototype.getValue = function(){
    console.log(this.val);
    }
    //聲明子類
    function Child(val,newVal){
    //構(gòu)造函數(shù)式繼承
    Father.call(this,val);
    this.newVal = newVal;
    }
    //類式繼承
    Child.prototype = new Father();
    //聲明子類原型方法
    Child.prototype.getNewValue = function(){
    console.log(this.newVal);
    }
    var instanceA = new Child("fatherA","childA");
    instanceA.companies.push('nemo');
    console.log(instanceA.companies); //['bigo','yy','uc','nemo']
    instanceA.getValue(); //fatherA
    instanceA.getNewValue(); //childA
    var instanceB = new Child("fatherB","childB");
    console.log(instanceA.companies); //['bigo','yy','uc']
    instanceB.getValue(); //fatherB
    instanceB.getNewValue(); //childB
    
    
    

    缺點(diǎn):

    在使用構(gòu)造函數(shù)繼承使用執(zhí)行了一遍父類的構(gòu)造函數(shù),在實(shí)現(xiàn)子類原型的類式繼承再調(diào)用了一遍父類的構(gòu)造函數(shù),父類構(gòu)造函數(shù)被調(diào)用了兩次。

    原型式繼承

    function inheritObject(obj){
    function F(){};
    F.prototype = obj;
    return new F();
    }
    var situation = {
    companies:['bigo','yy','uc'];
    area:'guangzhou';
    }
    var situationA = inheritObject(situation);
    situationA.area = 'shenzhen';
    situationA.companies.push('tencent');
    var situationB = inheritObject(situation);
    situationB.area = 'beijing';
    situationB.companies.push('baidu');
    console.log(situationA.area); //shenzhen
    console.log(situationA.companies); //['bigo','yy','uc','tencent','baidu']
    console.log(situationB.area); //beijing
    console.log(situationB.companies); //['bigo','yy','uc','tencent','baidu']
    console.log(situation.area); //guangzhou
    console.log(situation.companies); //['bigo','yy','uc','tencent','baidu']
    
    
    

    是類式繼承的一個(gè)封裝,其中的過渡對象就相當(dāng)于類式繼承的子類,然后返回新的實(shí)例化對象。

    缺點(diǎn):

    跟類式繼承一樣,父類的公有引用屬性被共有。

    寄生式繼承

    function inheritObject(obj){
    function F(){};
    F.prototype = obj;
    return new F();
    }
    var situation = {
    companies:['bigo','yy','uc'];
    area:'guangzhou';
    }
    function createSituation(obj){
    //通過原型繼承創(chuàng)建新對象
    var newObj = new inheritObject(obj);
    //定義新對象方法
    newObj.getArea = function(){
    console.log(newObj.area)
    }
    //返回對象
    return obj;
    }
    
    
    

    只是在原型式繼承的基礎(chǔ)上添加了新屬性和方法,還是跟原型式繼承一樣的缺點(diǎn)。

    寄生式組合繼承

    function inheritObject(obj){
    function F(){};
    F.prototype = obj;
    return new F();
    }
    //傳遞參數(shù) child,parent 子類父類
    function inheritPrototype(child,parent){
    //復(fù)制一份父類的原型副本保存在變量中;
    var fatherProto = inheritObject(father.prototype);
    //修正因?yàn)橹貙懽宇愒蛯?dǎo)致子類的constructor屬性被修改;
    fatherProto.constructor = child;
    //設(shè)置子類的原型
    child.prototype = fatherProto;
    }
    //聲明父類
    function Father(val){
    this.companies =['bigo','yy','uc']
    this.val = val;
    }
    //聲明父類原型方法
    Father.prototype.getValue = function(){
    console.log(this.val);
    }
    //聲明子類
    function Child(val,newVal){
    //構(gòu)造函數(shù)式繼承
    Father.call(this,val);
    this.newVal = newVal;
    }
    //類式繼承
    Child.prototype = new Father();
    inheritPrototype(Child,Father);
    //聲明子類原型方法
    Child.prototype.getNewValue = function(){
    console.log(this.newVal);
    }
    
    
    

    1.在構(gòu)造函數(shù)繼承中我們已經(jīng)調(diào)用了父類的構(gòu)造函數(shù),還差一個(gè)原型的副本

    2.通過原型繼承得到副本,但是這時(shí)候fatherProto的constructor需要指向子類。

    3.最后將副本fatherProto賦給子類的原型prototype。

    總的來說,就是既要構(gòu)造函數(shù),又要原型繼承,但是又避免了組合繼承的兩次調(diào)用父類構(gòu)造函數(shù)的問題,最大的改變式對子類原型賦予的式父類原型的一個(gè)引用。

    var instanceA = new Child("fatherA","childA");
    instanceA.companies.push('nemo');
    console.log(instanceA.companies); //['bigo','yy','uc','nemo']
    instanceA.getValue(); //fatherA
    instanceA.getNewValue(); //childA
    var instanceB = new Child("fatherB","childB");
    console.log(instanceA.companies); //['bigo','yy','uc']
    instanceB.getValue(); //fatherB
    instanceB.getNewValue(); //childB
    
    

    注意點(diǎn):

    此時(shí)子類如果需要添加原型方法,必須通過prototype點(diǎn)語法一個(gè)個(gè)添加,否則會覆蓋掉繼承父類的原型對象。
    ES6 新增了Class語法,Class 可以通過extends關(guān)鍵字實(shí)現(xiàn)繼承,這比 ES5 的通過修改原型鏈實(shí)現(xiàn)繼承,要清晰和方便很多。

    Class 繼承

    class Parent {
    constructor(value) {
    this.val = value
    }
    getValue() {
    console.log(this.val)
    }
    }
    class Child extends Parent {
    constructor(value) {
    super(value)
    }
    }
    let child = new Child(1)
    child.getValue() // 1
    child instanceof Parent // true
    
    

    class 實(shí)現(xiàn)繼承的核心在于使用 extends 表明繼承自哪個(gè)父類,并且在子類構(gòu)造函數(shù)中必須調(diào)用 super,因?yàn)檫@段代碼可以看成 Parent.call(this, value)。

    如果子類沒有定義constructor方法,這個(gè)方法會被默認(rèn)添加。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    全面分析JavaScript 繼承

    全面分析JavaScript 繼承:ES6之前,JavaScript并沒有繼承這一現(xiàn)有的機(jī)制。 ES5的繼承方式 類式繼承 //聲明父類 function Father(){ this.fatherVal = 'father'; } //為父類添加共有方法 Father.prototype.getFatherValue = function(){
    推薦度:
    標(biāo)簽: js 全面 解析
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 无码日韩精品一区二区免费暖暖| 精品无码一区二区三区亚洲桃色| 91麻豆国产福利精品| 国产麻豆精品久久一二三| 国精无码欧精品亚洲一区| 国产成人精品免费久久久久| 国产精品视频免费| 国产精品99精品视频网站| 久久无码精品一区二区三区| 亚洲精品无码久久一线| 91精品国产福利尤物| 国产精品自在线拍国产电影| 完整观看高清秒播国内外精品资源| 在线观看亚洲精品福利片| 69国产成人综合久久精品| 国产午夜精品一区二区| 四虎成人精品无码| 精品国产欧美另类一区| 精品乱码久久久久久夜夜嗨| 无码囯产精品一区二区免费| 在线电影国产精品| 亚洲欧洲国产精品香蕉网| 久久精品国产精品青草 | 亚洲精品乱码久久久久久蜜桃图片| 2021精品国产综合久久| 天天爽夜夜爽夜夜爽精品视频| 99精品国产高清一区二区麻豆| 成人精品一区二区久久| 久久香蕉国产线看观看精品yw| 国产精品色视频ⅹxxx| 99精品国产在热久久| 亚洲AV永久无码精品水牛影视| 久久精品亚洲男人的天堂| 日韩精品一区二区三区大桥未久| 日韩精品无码AV成人观看| 久夜色精品国产一区二区三区 | 一本久久a久久精品综合香蕉| 国产亚洲曝欧美不卡精品| 国内精品久久国产大陆| 精品人妻久久久久久888| 色一乱一伦一图一区二区精品|