首頁 > web前端 > 前端問答 > es6的class繼承為什麼要呼叫super

es6的class繼承為什麼要呼叫super

青灯夜游
發布: 2022-10-20 17:36:43
原創
1247 人瀏覽過

原因:衍生出的建構子不會創造新的this對象,也就是子類別沒有自己的this;只有透過super()把基底類別(父類別)建立好的this物件接下來,衍生類別才能像基底類別一樣使用this來產生物件的屬性。

es6的class繼承為什麼要呼叫super

本教學操作環境: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。 衍生出的建構子不會創造新的<span style="background-color:#ffd900;">this</span>#物件<span style="background-color:#ffd900;">(或說this指向的物件</span>(這裡可以回顧一下new關鍵字做的事情),就是所說的"子類別沒有自己的this"。只有透過<span style="background-color:#ffd900;">super()</span>把基底類別建立好的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(&#39;tom&#39;,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(&#39;Good morning folks!&#39;);
  }
}
登入後複製

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

greetColleagues() {
    alert(&#39;Good morning folks!&#39;);
    alert(&#39;My name is &#39; + this.name + &#39;, nice to meet you!&#39;);
  }
登入後複製

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

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

【相關推薦:javascript影片教學程式設計影片

以上是es6的class繼承為什麼要呼叫super的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板