1、實現(xiàn)繼承的方法如下:
// 父類
class People{
constructor(name){
this.name=name
}
eat() {
console.log(
`${this.name} eat something...`
)
}
}
// 子類
// [extends] (ES6)關(guān)鍵字用來創(chuàng)建一個普通類或者內(nèi)建對象的子類
class Student extends People {
//constructor 屬性返回對創(chuàng)建此對象的數(shù)組函數(shù)的引用淹朋。
constructor(name,number){
//[super](ES6)關(guān)鍵字用于訪問和調(diào)用一個對象的父對象上的函數(shù)笙各。
super(name)
this.number = number
}
sayHi(){
console.log(
`姓名 ${this.name} ,學(xué)號 ${this.number}`
)
}
}
// 子類
class Teacher extends People {
constructor(name, major) {
super(name)
this.major = major
}
teach() {
console.log(
`${this.name} 教授 ${this.major}`
)
}
}
//通過類聲明對象/實例
const xialuo =new Student('夏洛' ,100)
console.log(xialuo.name) //夏洛
console.log(xialuo.number) //100
xialuo.sayHi() //姓名 夏洛 础芍,學(xué)號 100
xialuo.eat() //夏洛 eat something...
// //通過類聲明對象/實例
const wang = new Teacher('王老師', '語文')
console.log(wang.name) //王老師
console.log(wang.major) //語文
wang.teach() //王老師 教授 語文
wang.eat() //王老師 eat something...
[constructor] 屬性返回對創(chuàng)建此對象的數(shù)組函數(shù)的引用杈抢。
[extends] ES6關(guān)鍵字用來創(chuàng)建一個普通類或者內(nèi)建對象的子類
[super] ES6關(guān)鍵字用于訪問和調(diào)用一個對象的父對象上的函數(shù)。
2仑性、class的本質(zhì)是什么
console.log(typeof Student)//function
console.log(typeof People) //function
根據(jù)以上實例確定class的類型實際上是函數(shù)惶楼,可見class是語法糖
3、如何實現(xiàn)繼承
通過判斷實例的隱式原型和class的顯示原型
console.log(xialuo.prototype) //xialuo的顯式原型:undefined
// 實例xialuo沒有顯示原型
console.log(xialuo.__proto__) //xialuo的隱式原型:People {constructor: ?, sayHi: ?}
console.log(Student.prototype) //Student的顯式原型 People {constructor: ?, sayHi: ?}
console.log(xialuo.__proto__ === Student.prototype) //true
實例xialuo的隱式原型 == 父類的顯式原型
由此判斷诊杆,子類實例就可以通過搜索原型的方法來訪問父類中的所有屬性和方法
原型關(guān)系圖如下:
總結(jié)原型關(guān)系如下:
每個class都有顯式原型 prototype
每個實例都有隱式原型 proto
實例的 proto 指向?qū)?yīng)class的 prototype
原型的執(zhí)行規(guī)則:
獲取屬性xialuo.name或執(zhí)行方法xialuo.sayhi時
現(xiàn)在自身屬性和方法尋找
如果找不到自動去proto查找
4歼捐、延伸:instanceof 基于原型鏈判斷類型
instanceof 可以判斷一個引用是否屬于某構(gòu)造函數(shù)
console.log(xialuo instanceof Student) //true
console.log(xialuo instanceof People) //true
console.log(xialuo instanceof Object) //true
console.log([] instanceof Array) //true
console.log([] instanceof Object) //true
console.log({} instanceof Object) //true
instanceof 主要的實現(xiàn)原理就是只要右邊變量的 prototype 在左邊變量的原型鏈上即可。因此晨汹,instanceof 在查找的過程中會遍歷左邊變量的原型鏈豹储,直到找到右邊變量的 prototype,如果查找失敗淘这,則會返回 false剥扣。