站長資訊網
        最全最豐富的資訊網站

        es6的class繼承為什么要調用super

        原因:派生出的構造函數不會創造新的this對象,即子類沒有自己的this;只有通過super()把基類(父類)創建好的this對象接下來,派生類才能像基類一樣使用this來生成對象的屬性。

        es6的class繼承為什么要調用super

        前端(vue)入門到精通課程:進入學習
        Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

        本教程操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

        在學習ES6 class繼承時往往提到一個關鍵點

        一個子類 SubClass 繼承父類 SuperClass 的構造器constructor時有兩個要求:

        • 1)必須在構造器調用 super( )。

        • 2) this必須寫在super( )之后。

        第一點是為了解決父類子類的歧義,確定了

        “子類沒有自己的 this”這一概念

        子類和父類是個相對的概念,因為一個類可以既是子類也是父類,所以ES6里用的是絕對的概念:基類和派生類。而且這個概念是針對所有構造函數說的,JS 里的構造函數要么是基的,要么就是派生的。

        ES6中,我們隨手寫的構造函數(function)都是基類,基類可以直接用this來指向調用它所在方法的對象。

        咱自己給this總結了一句話:誰調用了this,this就指向誰。

                function Super(name) {             this.name = name;             SuperFactory.prototype.sayHi = function () {                 console.log("Hi");             }         }          let super = new Super("peter");//通過new創建了新的對象,Super()中的this即指向這個對象
        登錄后復制

        ES6中的派生類,就是extend的class。派生出的構造函數不會創造新的this對象(或者說this指向的對象(這里可以回顧一下new關鍵字做的事情),就是所說的"子類沒有自己的this"。只有通過super()把基類創建好的this對象接下來,派生類才能像基類一樣使用this來生成對象的屬性。

         class SuperClass {                //基類 not父類     constructor(name) {         this.name = name;         }      sayHi() {         console.log("Hi");         }     };   class SubClass extends SuperClass {//派生類 not子類     constructor(name,age) {                 surpe(name);                 this.age = age;             }     sayNo() {         console.log("NO");         }     };          let subinst = new subClass('tom',18); subinst.sayHi();//Hi subinst.sayNo();//NO
        登錄后復制

        那this為什么必須寫在super( )之后

        是為了避免一個代碼陷阱。

        class Person {   constructor(name) {     this.name = name;   } }   class PolitePerson extends Person {   constructor(name) {     this.greetColleagues(); // 這里不允許我們使用this,下面解釋     super(name);   }   greetColleagues() {     alert('Good morning folks!');   } }
        登錄后復制

        上面的例子假設調用 super( )之前允許使用 this, 一段時間后為了滿足一些需求,我們在 greetColleagues( ) 中添加:

        greetColleagues() {     alert('Good morning folks!');     alert('My name is ' + this.name + ', nice to meet you!');   }
        登錄后復制

        但是我們忘了,this.greetColleagues( ) 在 super( )調用之前,this.name根本都沒有定義,代碼會拋錯,像這樣的代碼可能很難想到什么時候發生。

        因此,為了避免這個陷阱,JavaScript 強制要求在 constructor 中使用 this 之前,必須先調用 super。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产一精品一av一免费爽爽| 精品国产香蕉伊思人在线在线亚洲一区二区 | 国产精品污WWW在线观看| 国产精品免费一区二区三区| 国产成人久久精品激情| 亚洲精品在线视频| 国产亚洲精品无码专区| 先锋影音国产精品| 国产成人精品日本亚洲网站 | 精品多毛少妇人妻AV免费久久| 国产精品青草久久久久婷婷 | 精品国产三级a∨在线| 亚洲国产精品第一区二区三区| 国产精品青青在线观看爽香蕉 | 国产精品欧美久久久天天影视| 欧美精品v欧洲精品| 亚洲精品亚洲人成在线观看| 欧美日韩综合精品| 久久精品国产99久久香蕉| 久久精品成人免费网站| 国产精品无码久久久久久| 色欲久久久天天天综合网精品| 亚洲乱码日产精品a级毛片久久| 久久99精品国产麻豆婷婷| 国产精品欧美亚洲韩国日本久久| 99久久精品费精品国产| 亚洲国产精品一区| 亚洲永久永久永久永久永久精品 | 亚洲高清专区日韩精品| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 国产欧美精品AAAAAA片| 无码精品国产VA在线观看| 正在播放国产精品每日更新| 四虎永久在线精品国产馆V视影院| 精品国产一区二区三区2021| 国产精品内射久久久久欢欢| 国产偷国产偷高清精品| 国产精品无码免费专区午夜| 国产精品亚洲αv天堂无码| 国产精品自产拍在线18禁 | 亚洲AV无码久久精品狠狠爱浪潮|