類型判斷 instanceof
instanceof 運(yùn)算符用來測試一個(gè)對象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的 prototype 屬性。
拿回上章Class中的案例進(jìn)行修改
class Student {
// 屬性
constructor(name, number) {
this.name = name
this.number = number
}
// 方法
sayHi() {
console.log(`姓名:${this.name},學(xué)號:${this.number}`)
}
}
const xiaokonglong = new Student('小恐龍', 001)
console.log(xiaokonglong instanceof Student) // true
console.log(xiaokonglong instanceof Object) // ture
- xiaokonglong是由Student 構(gòu)建而來的,所以使用instanceof檢查是否時(shí)返回true
- 所有的引用類型instanceof Object返回的都是true
舉個(gè)栗子:
[] instanceof Array //true
[] instanceof Object //true
{} instance Object //true
原型
- 上章中實(shí)例化Student后可以看到,xiaokonglong擁有了name,number和一個(gè)sayHi()的方法
-
__proto__并非我們定義的屬性,但是仍然可以打印,而且會發(fā)現(xiàn)打印之后里面也有sayhi的方法。
console.log(typeof Student) //function
console.log(xiaokonglong.name) // 小恐龍
console.log(xiaokonglong.number) //1
xiaokonglong.sayHi() // 姓名:小恐龍,學(xué)號:1
console.log(xiaokonglong.__proto__)
/**{
constructor: class Student
sayHi: ? sayHi()
}*//
那么我們打印一下Student
console.log(Student.prototype)
/**{
constructor: class Student
sayHi: ? sayHi()
}*//
console.log(Student.prototype === xiaokonglong.__proto__) // true
這時(shí)就會發(fā)現(xiàn),他的結(jié)果和xiaokonglong.__proto__結(jié)果是一樣的,都有一個(gè)sayhi的方法。而且他們是全等的。那么我們先把__proto__叫做隱式原型,prototype叫做顯示原型。
那么我們就會得到,Student的顯示原型就等于xiaokonglong的隱式原型。
結(jié)論
- 每個(gè)class都有顯示原型
prototype - 每個(gè)實(shí)例都會有隱式原型
__proto__ - 實(shí)例的隱式原型(
__proto__)對應(yīng)class的顯示原型(prototype)
基于原型的執(zhí)行方法
- 當(dāng)獲取實(shí)例的屬性或者方法時(shí),會先在自身的屬性和方法進(jìn)行尋找,如果找不到就會自動去隱式原型中尋找,一直找不到最終就會
Object.__proto__就會拋出underfind,原因是就是因?yàn)?code>Object.__proto__永遠(yuǎn)指向null。
延伸
對原型鏈感興趣的,以下兩個(gè)方法會更好的幫助理解原型鏈究竟是個(gè)什么東西,喜歡可以嘗試一下。
hasOwnProperty 尋找自身屬性值是否包含該屬性
instanceof 尋找自身原型鏈中是否包含該屬性
最后,不要忘記點(diǎn)贊哦~