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)部的屬性。