class繼承,原型鏈

1.構造函數(shù),原型,實例之間的關系

每個構造函數(shù)都有一個原型對象(prototype屬性),原型對象都包含一個指向構造函數(shù)的指針(prototype.constructor),實例包含一個指向原型對象的指針(_ proto _屬性)

2.原型鏈

  • 當原型對象等于另一個類型的實例時,原型對象也包含指向另一個原型對象的指針,形成原型鏈。
  • 當一個對象查詢某個屬性或方法的時候,JavaScript引擎首先會搜索對象本身是否答案,如果沒有,就會去它的原型對象中繼續(xù)搜索,如果沒有,再去它的原型的原型中去找,這就形成了一個原型鏈。直到Object的prototype為止。

3.class中的原型

class中定義的方法,屬性,都是在類的prototype屬性上定義的

class Point {
    constructor() {
     }
    toString() {
    }
   toValue() {
   }
 }

// 等同于

 Point.prototype = {
   constructor() {},
   toString() {},
   toValue() {},
};

但是類內(nèi)部定義的方法是不可枚舉的。

4.class繼承

  • 形式

     class Point { /* ... */ }
    
    class ColorPoint extends Point {
      constructor() {
         super();
       }
     }
    

注意:子類constructor中必須調(diào)用super(),才可以使用this;因為子類沒有自己的this對象,而是繼承父類的this對象,然后對其進行加工。這也是es6與es5繼承上的區(qū)別。es5中,繼承是先創(chuàng)建子類實例的this,在這個基礎上添加父類的方法和屬性。es6中是先創(chuàng)建父類實例對象的this,然后用子類的構造函數(shù)修改。

5.Object.getPrototypeOf( )

  • 判斷是否從子類獲取父類(一個類是否繼承另一個類)

  • 判斷是否從實例獲取對象原型

           Object.getPrototypeOf(ColorPoint) === Point    //true
    

6.super用法

1). 當做函數(shù)調(diào)用時,代表父類的構造函數(shù)。

   class A {
     constructor() {
       console.log(new.target.name);
     }
  }
  class B extends A {
     constructor() {
       super();
     }
  }
  new A() // A
  new B() // B

super雖然代表了父類A的構造函數(shù),但是返回的是子類B的實例,即super內(nèi)部的this指的是B,因此super()在這里相當A.prototype.constructor.call(this)。
因此

  • 定義在父類實例上的屬性和方法(通過this.property=something 定義的)無法通過super調(diào)用。
  • 通過super調(diào)用父類的方法,super綁定子類的this。this指針指向的是子類。即在子類的環(huán)境中運行。
  • 若通過super對某個屬性進行賦值,super就是this。這個屬性就是子類的實力 屬性。

2)super當做對象使用

  • 在普通方法中,super指向父類的原型對象
  • 在靜態(tài)方法(static關鍵字)中,super指向的是父類。
    總結一句話就是靜態(tài)對靜態(tài),普通對普通。

7.類的prototype和proto屬性

es5中每個對象都具有proto屬性,它指向?qū)臉嬙旌瘮?shù)的prototype屬性。class具備protp屬性和prototype屬性。

  • proto:表示構造函數(shù)的繼承,指向父類

         Object.setPrototypeOf(B, A)
         //B實例繼承A的實例
    
  • prototype.prpto:指向父類的原型

        Object.setPrototypeOf(B.prototype, A.prototype)
        //B的實例繼承A的靜態(tài)屬性
    

8.extend繼承目標

  • 子類繼承Object類

    class A extends Object {
     }
    A.__proto__ === Object // true
    A.prototype.__proto__ === Object.prototype // true
    
  • 不存在繼承

    class A {
       }
    A.__proto__ === Function.prototype // true
    A.prototype.__proto__ === Object.prototype // true
    
  • 子類繼承于null

     class A extends null {
      }
     A.__proto__ === Function.prototype // true
     A.prototype.__proto__ === undefined // true
    

9.實例的proto屬性

子列原型的原型,是父類的原型。同es5中的對象的proto屬性指向構造函數(shù)的原型,一致。

10.原生構造函數(shù)的繼承

原生構造函數(shù)有:Number(), Date(),RegExp(),Array(),String(),Error(),Function(),Object(),Boolean().es5中原生構造函數(shù)不能夠繼承,因為原生構造函數(shù)的this無法綁定,拿不到內(nèi)部的屬性。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容