最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
再和“面向?qū)ο蟆闭剳賽?super(六)

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

成都創(chuàng)新互聯(lián)公司2013年成立,先為崇明等服務建站,崇明等地企業(yè),進行企業(yè)商務咨詢服務。為崇明企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。

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

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

  1. super作為函數(shù)調(diào)用時,代表父類的構(gòu)造函數(shù)
  2. 調(diào)用super后,this會被改成子類
  3. 只能用在構(gòu)造函數(shù)里,用在其它地方報錯
{
    class Father{
        constructor(){
            console.log(new.target.name);
        }
    }
    class Son extends Father{
        constructor(){
            super();
            this.a=10;  //這里的this指向,Son的實例
        }
        method(){
            //super()   報錯,只能用在constructor里
        }
    }
    new Father();   //Father(new.target返回Father類)
    new Son();      //Son(new.target返回Son子類)
    console.log(new Son().a);   //10 this指向被修改成了子類的實例
}

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

2、當作對象使用

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

  1. 在普通方法中,指向父類的原型對象
    • 只能調(diào)用原型里的東西
    • 如果調(diào)用的是方法,那方法內(nèi)部this指向子類實例
    • 如果用super去添加屬性的話,super就是this(實例)
  2. 在私有方法中,指向父類,而不是父類的原型
    • 如果調(diào)用的是方法,那方法內(nèi)部this指向子類而不是子類實例

在普通方法中使用

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

{
    class Father{
        constructor(){
            this.a='父類實例的a';
            this.b='父類實例的b';
        }
        showB(){
            console.log(`這是父類身上的共享方法,并且會彈出${this.b}`);
        }
        static showB(){ //私有方法可以與上面的方法重名
            console.log(`這是父類身上的私有方法,并且會彈出${this.b}`);
        }
    }
    Father.prototype.a='父類原型的a';   //在原型身上的添加一個屬性a

    class Son extends Father{
        constructor(){
            super();    //這里的super是個方法,作用為引入父類的構(gòu)造函數(shù)(當作函數(shù)使用)
            this.b='子類實例的b';

            //此處聲明:請按注釋標的序號順序執(zhí)行代碼

            //
            /*
             *  3、super設置屬性
             *      1、用super設置屬性的話,super就代表當前環(huán)境的this。而當前環(huán)境為子類的constructor,所以此時的super代表的就是子類的實例對象
             *      2、此時下面的showB()方法彈出的內(nèi)容為"這是父類身上的共享方法,并且會彈出super就是this"是因為,如果super為this的話,那就與上面那段代碼重復了,后面覆蓋前面
             *
             */
            super.b='super就是this';

            /*
             *  4、super獲取屬性
             *      1、此時super的作用是獲取屬性,它依然指向父類的原型對象所以下面這句話相當于console.log(Father.prototype.b);所以結(jié)果為undefined。雖然在上面定義了super.b那也不會改變super的指向
             */
            console.log(super.b);     //undefined

            /*
             *  1、這里的super是一個對象,因為constructor是個普通對象
             *      1、super指向父類的原型對象,調(diào)用的是Father的共享方法showB()
             *      2、showB方法里的this指向子類的實例,取的是Father的constructor里定義的b
             */
            super.showB();  //這是父類身上的共享方法,并且會彈出子類實例的b

            //2、super獲取屬性
            console.log(super.a);   //父類原型的a   再次驗證只能調(diào)用原型上的東西。原型上與constructor里都有個a,但是調(diào)的是原型上的
        }
    }
    Son.b='子類的私有屬性b';
    new Son();
}

在私有方法中使用

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

{
    class Father{
        constructor(){
            this.b='父類實例的b';
        }
        showB(){
            console.log(`這是父類身上的共享方法,并且會彈出${this.b}`);
        }
        static showB(){ //這是個私有方法,與上面的方法重名是可以的
            console.log(`這是父類身上的私有方法,并且會彈出${this.b}`);
        }
    }
    Father.prototype.b='父類原型的b';   //在原型身上的添加一個屬性b

    class Son extends Father{
        constructor(){
            super();
            this.b='子類實例的b';
        }

        /*
         *  1、這里的super是在私有方法里調(diào)用,所以指向父類,調(diào)用的是Father里定義的static showB方法
         *  2、此方法里的this指向被改成了子類,彈出的b是子類的私有屬性b
         */
        static log(){
            super.showB();
        }
    }
    Son.b='子類的私有屬性b';
    Son.log();  //這是子類身上的私有方法,并且會彈出子類的私有屬性b
}

忠告:要明確指定supe的類型

super在用的時候必需指定它的類型,不然不清不楚的去用,瀏覽器會給你報錯!

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

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


分享名稱:再和“面向?qū)ο蟆闭剳賽?super(六)
URL分享:http://fisionsoft.com.cn/article/jiijos.html