成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

再和“面向?qū)ο蟆闭剳賽?- super(六)

Towers / 1908人閱讀

摘要:同時(shí)彈出的結(jié)果是指向了子類,又說明雖然調(diào)用的是父類的構(gòu)造函數(shù),但是調(diào)用完后會(huì)指向子類,指向也被改成了子類的實(shí)例。

在上一篇文章里介紹了繼承,那其中說過一個(gè)很關(guān)鍵的東西想要繼承子類里里必需先調(diào)用一個(gè)super方法。而super的作用絕對是價(jià)值連城!同時(shí)super的作用還有多種,并且跟你的使用環(huán)境有關(guān)系。

1、當(dāng)作函數(shù)使用

super被當(dāng)作函數(shù)使用,這種情況是最普遍的,上一篇文章里已經(jīng)使用過。它有以下幾種作用:

super作為函數(shù)調(diào)用時(shí),代表父類的構(gòu)造函數(shù)

調(diào)用super后,this會(huì)被改成子類

只能用在構(gòu)造函數(shù)里,用在其它地方報(bào)錯(cuò)

{
    class Father{
        constructor(){
            console.log(new.target.name);
        }
    }
    class Son extends Father{
        constructor(){
            super();
            this.a=10;  //這里的this指向,Son的實(shí)例
        }
        method(){
            //super()    報(bào)錯(cuò),只能用在constructor里
        }
    }
    new Father();    //Father(new.target返回Father類)
    new Son();        //Son(new.target返回Son子類)
    console.log(new Son().a);   //10 this指向被修改成了子類的實(shí)例
}

子類里面并沒有寫console.log,但是發(fā)現(xiàn)生成子類實(shí)例后,控制臺(tái)里有輸出。說明:super其實(shí)相當(dāng)于執(zhí)行了父級的constructor方法。同時(shí)彈出的結(jié)果是指向了子類,又說明雖然調(diào)用的是父類的構(gòu)造函數(shù),但是調(diào)用完后會(huì)指向子類,this指向也被改成了子類的實(shí)例。其實(shí)supe的作用相當(dāng)于執(zhí)行Father.prototype.constructor.call(this);

2、當(dāng)作對象使用

super也可以被當(dāng)作對象使用,被當(dāng)作對象使用的時(shí)候情況有些復(fù)雜,跟上面是完全不一樣的,同時(shí)又按使用環(huán)境分為了兩種情況。

在普通方法中,指向父類的原型對象

* 只能調(diào)用原型里的東西
* 如果調(diào)用的是方法,那方法內(nèi)部this指向子類實(shí)例
* 如果用super去添加屬性的話,super就是this(實(shí)例)

在私有方法中,指向父類,而不是父類的原型

* 如果調(diào)用的是方法,那方法內(nèi)部this指向子類而不是子類實(shí)例
在普通方法中使用

此時(shí)切記用super去獲取跟設(shè)置時(shí)的指向完全不一樣

{
    class Father{
        constructor(){
            this.a="父類實(shí)例的a";
            this.b="父類實(shí)例的b";
        }
        showB(){
            console.log(`這是父類身上的共享方法,并且會(huì)彈出${this.b}`);
        }
        static showB(){    //私有方法可以與上面的方法重名
            console.log(`這是父類身上的私有方法,并且會(huì)彈出${this.b}`);
        }
    }
    Father.prototype.a="父類原型的a";   //在原型身上的添加一個(gè)屬性a
    
    class Son extends Father{
        constructor(){
            super();    //這里的super是個(gè)方法,作用為引入父類的構(gòu)造函數(shù)(當(dāng)作函數(shù)使用)
            this.b="子類實(shí)例的b";
            
            //此處聲明:請按注釋標(biāo)的序號順序執(zhí)行代碼
            
            //
            /*
             *  3、super設(shè)置屬性
             *      1、用super設(shè)置屬性的話,super就代表當(dāng)前環(huán)境的this。而當(dāng)前環(huán)境為子類的constructor,所以此時(shí)的super代表的就是子類的實(shí)例對象
             *      2、此時(shí)下面的showB()方法彈出的內(nèi)容為"這是父類身上的共享方法,并且會(huì)彈出super就是this"是因?yàn)?,如果super為this的話,那就與上面那段代碼重復(fù)了,后面覆蓋前面
             *
             */
            super.b="super就是this";
            
            
            /*
             *  4、super獲取屬性
             *      1、此時(shí)super的作用是獲取屬性,它依然指向父類的原型對象所以下面這句話相當(dāng)于console.log(Father.prototype.b);所以結(jié)果為undefined。雖然在上面定義了super.b那也不會(huì)改變super的指向
             */
            console.log(super.b);      //undefined
            
            
            /*
             *  1、這里的super是一個(gè)對象,因?yàn)閏onstructor是個(gè)普通對象
             *      1、super指向父類的原型對象,調(diào)用的是Father的共享方法showB()
             *      2、showB方法里的this指向子類的實(shí)例,取的是Father的constructor里定義的b
             */
            super.showB();    //這是父類身上的共享方法,并且會(huì)彈出子類實(shí)例的b
            
            
            //2、super獲取屬性
            console.log(super.a);   //父類原型的a   再次驗(yàn)證只能調(diào)用原型上的東西。原型上與constructor里都有個(gè)a,但是調(diào)的是原型上的
        }
    }
    Son.b="子類的私有屬性b";
    new Son();
}
在私有方法中使用

此時(shí)切記用super的用法與在普通方法中的用法完全相反

{
    class Father{
        constructor(){
            this.b="父類實(shí)例的b";
        }
        showB(){
            console.log(`這是父類身上的共享方法,并且會(huì)彈出${this.b}`);
        }
        static showB(){    //這是個(gè)私有方法,與上面的方法重名是可以的
            console.log(`這是父類身上的私有方法,并且會(huì)彈出${this.b}`);
        }
    }
    Father.prototype.b="父類原型的b";   //在原型身上的添加一個(gè)屬性b
    
    class Son extends Father{
        constructor(){
            super();
            this.b="子類實(shí)例的b";
        }
        
        /*
         *  1、這里的super是在私有方法里調(diào)用,所以指向父類,調(diào)用的是Father里定義的static showB方法
         *  2、此方法里的this指向被改成了子類,彈出的b是子類的私有屬性b
         */
        static log(){
            super.showB();
        }
    }
    Son.b="子類的私有屬性b";
    Son.log();    //這是子類身上的私有方法,并且會(huì)彈出子類的私有屬性b
}
忠告:要明確指定supe的類型

super在用的時(shí)候必需指定它的類型,不然不清不楚的去用,瀏覽器會(huì)給你報(bào)錯(cuò)!

{
    class Father{};
    class Son extends Father{
        constructor(){
            super();    //這個(gè)是作為函數(shù)
            //console.log(super);    //報(bào)錯(cuò)  那這個(gè)super它是個(gè)什么呢?它自己矛盾了,瀏覽器迷茫了~
            console.log(super.a);   //這個(gè)是作為對象
        }
    }
}

下一篇,實(shí)戰(zhàn)!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96654.html

相關(guān)文章

  • 再和面向對象戀愛 - 圖片預(yù)加載組件(七)

    摘要:源碼下載至此再和面向?qū)ο笳剳賽巯盗形恼乱呀?jīng)全部更新完畢寫文章不易,且行且珍惜 再和面向?qū)ο笳剳賽?- 對象簡介(一)再和面向?qū)ο笳剳賽?- 對象相關(guān)概念(二)再和面向?qū)ο笳剳賽?- 面向?qū)ο缶幊谈拍睿ㄈ┰俸兔嫦驅(qū)ο笳剳賽?- class(四)再和面向?qū)ο笳剳賽?- 繼承(五)再和面向?qū)ο笳剳賽?- super(六) 通過前面的六篇文章已經(jīng)把ES6的面向?qū)ο蟾蠡镎f清楚了,大家最關(guān)心的...

    caoym 評論0 收藏0
  • 再和面向對象戀愛 - 繼承(五)

    摘要:面向?qū)ο罄镒畲蟮奶攸c(diǎn)應(yīng)該就屬繼承了。在第二篇文章里說過原型實(shí)例跟構(gòu)造函數(shù)之間的繼承,并且還講了一道推算題。 通過上一篇文章想必各位老鐵已經(jīng)熟悉了class了,這篇文章接著介紹繼承。面向?qū)ο罄镒畲蟮奶攸c(diǎn)應(yīng)該就屬繼承了。一個(gè)項(xiàng)目可能需要不斷的迭代、完善、升級。那每一次的更新你是要重新寫呢,還是在原有的基礎(chǔ)上改吧改吧呢?當(dāng)然,不是缺心眼的人肯定都會(huì)在原來的基礎(chǔ)上改吧改吧,那這個(gè)改吧改吧就需要...

    Airmusic 評論0 收藏0
  • 再和面向對象戀愛 - 面向對象編程概念(三)

    摘要:說到底面向?qū)ο蟛攀浅绦蛘Z言的根本。其實(shí)面向?qū)ο缶幊陶f的就是自定義對象。里并沒有類的概念,所以嚴(yán)格上來講這是個(gè)假的面向?qū)ο罄锏拿嫦驅(qū)ο缶幊态F(xiàn)在好了,終于聽到別人鄙視我們了,給我們提供了類這個(gè)概念,其實(shí)是向傳統(tǒng)語言更靠齊了。 通過前兩篇文章,我們了解了對象的概念以及面向?qū)ο罄锏南嚓P(guān)概念等知識(shí),那前面說了對象分類里的前兩種,這篇文章要詳細(xì)去說第三種自定義對象,那真正的好戲這就來了! 面向?qū)ο?..

    Cruise_Chan 評論0 收藏0
  • 再和面向對象戀愛 - class(四)

    摘要:在上一篇文章里我介紹了一下面向?qū)ο缶幊痰母拍?,在最后終于喜出望外看到了提供了類的概念了。而到了里面真正的類與構(gòu)造函數(shù)現(xiàn)在是分離的,通過上面的代碼可以看出來,這種寫法正是面向?qū)ο蟮恼y(tǒng)寫法。 在上一篇文章里我介紹了一下面向?qū)ο缶幊痰母拍睿谧詈蠼K于喜出望外看到了ES6提供了類的概念了。那這個(gè)類如何去用,是這篇文章的主題。ES6給我們提供了一個(gè)class關(guān)鍵字。這個(gè)關(guān)鍵字跟以前的var l...

    劉東 評論0 收藏0
  • 再和面向對象戀愛 - 對象相關(guān)概念(二)

    摘要:所有的對象都是由構(gòu)造函數(shù)創(chuàng)建的對象哪來的構(gòu)造函數(shù)生的。而普通函數(shù)不能生成對象不孕不育,構(gòu)造函數(shù)可以生成對象有生育能力。別急,記住那句話永遠(yuǎn)指向?qū)嵗龑ο髮?yīng)的構(gòu)造函數(shù)的,那就先看實(shí)例對象是誰。 上一篇文章把對象的概念講解了一下,這篇文章要重點(diǎn)解釋最讓大家犯迷糊的一些概念,包括 構(gòu)造函數(shù) 實(shí)例 繼承 構(gòu)造函數(shù)的屬性與方法(私有屬性與方法) 實(shí)例的屬性與方法(共享屬性與方法) protot...

    qpwoeiru96 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<