ES6 class類知識點梳理
大概從幾個方面來講解ES6 class類和傳統的構造函數的區別。
- 必須要有
constructor()
方法 ,默認返回this
(即構造函數的實例) - 除非
this
指定,所有的方法都在類的原型鏈上(Point.prototype
),并且所有的方法都是不可枚舉的。
class Point {
constructor(a, b) {
this.a =a;
this.b = b;
return Object.create(null)
}
toString(){
console.log(`a: ${this,a} ====== b: ${this.b} `)
}
}
var a = new Point()
a.hasOwnProperty('a') // ture
a.hasOwnProperty('b') // ture
a.hasOwnProperty('constructor') // false
Object.keys(a) // []
Object.keys(Point.prototype) // []
Object.getOwnPropertyNames(Point.prototype) //["constructor", "toString"]
- 可以通過改變constructor() 方法的return值,來改變實例的值。
class Point {
constructor(a, b) {
this.a =a;
this.b = b;
return Object.create(null)
}
toString(){
console.log(`a: ${this,a} ====== b: ${this.b} `)
}
}
var a = new Point()
a // {}
- 所有和實例共享同一個原型鏈,這個和es5一致
let a = new Point();
let b = new Point();
a.__proto__ === b.__proto__
-
class表達式寫法以及name屬性(緊跟著class關鍵值后面的類名)
和函數一樣,class也有表達式的寫法,只能用于內部調用。如果用于外部就會報錯。
// 這里類名就是myClass,而不是me,me只是給內部調用,如果不需要可以直接省略
const myClass = class me {
getName() {
return me.name
}
}
let a = new myClass()
a.getName() // me
- 不存在變量提升,可以利用表達式寫法,立刻生成實例。
- class類對屬性值的get和set關鍵值,攔截屬性的獲取。所有的
get和set
都是定義在屬性的descriptor
中的
class hh {
constructor() {}
get prop() {
return 'getter'
}
set prop(val) {
console.log(`setter ${val}`)
}
}
let inst = new hh()
inst.prop = 'fs' // "setter fs"
inst.prop // getter
class的靜態方法: 在方法前面加上
static
,只能被類本身調用,不可以被實例調用。靜態方法可以被子類繼承。-
new.target
屬性的使用-
new targe
在函數內部等于構造函數本身,用于類中,指向類本身 - 可以用于創建只能繼承不能實例的類
-
用過extends關鍵字實現繼承,通過super返回父類的實例,從而在子類中使用this。
static
靜態方法也會被子類繼承。-
通過Object.getOwnPrototypeOf(子類) 獲取子類的父類,由于子類的
prototype
被重寫,等于父類的原型。class A { static hello() { console.log('hello world'); } } class B extends A { } // 通過下面這句,extends繼承相當于是 B.__proto__ === A ,所以B的原型鏈上面可以找到A,實現了繼承.正常情況下,一個對象的__proto__會指向構造函數的原型 A.__proto__ === Function.prototype // 函數都是Function構造函數創建 Object.getPrototypeOf(B) === A let obj = new B() // 現在實例化B // obj.__proto__ => B.prototype // => B.prototype.__proto__ => A.prototype // A.prototype.__proto__ => Object.prototype
-
super
關鍵字- 作為函數 (只存在于子類的構造函數中)
- 作為對象 (普通方法中作為 父類的原型) (靜態方法中指向 父 類)
- 在通過
super
調用父類的方法時,this
指向的是子類 -
super
綁定了子類的this
-
類的
prototype
和__proto__
屬性子類的
__proto__
指向父類-
子類
prototype
屬性的__proto__
指向父類的prototype
屬性B.__proto === A; B.prototype.__proto__ === A.prototype;
-
extends
關鍵字多種繼承- 對象
- 不存在繼承
- null
-
實例
__proto__
屬性- 實例的
__proto__
- 實例的