Class
在學習原型和原型鏈之前,首先來說一下ES6誕生的新語法——class類,它是一個語法糖(就是更方便程式員使用的一種玩意),對比ES5,ES6中類的寫法更加清晰、更像面向物件編程,一個類(建構式)的所有代碼都放入同一段代碼塊中,更加容易管理維護,通俗點來說,class實際上就是函式,
上代碼!
// 創建父類
class Dog{
// 創建父類屬性
constructor(name,color){
this.name = name;
this.color = color;
}
bark(){
console.log(`我是${this.color}的${this.name},汪汪汪!!!`);
}
}
// 子類1
class HaShiQi extends Dog{
// 創建子類屬性
constructor(name,color,hobby){
// 接收父類屬性直接用super(父屬性1,父屬性2)
super(name,color);
this.hobby = hobby;
}
run(){
console.log(`大家好,我是${this.color}的${this.name},我喜歡${this.hobby}`)
}
}
// 子類2
class KeJi extends Dog{
constructor(name,color,sport){
super(name,color);
this.sport = sport;
}
go(){
console.log(`大家好,我是${this.color}的${this.name},我喜歡${this.sport}`)
}
}
// 創建實體
const dog1 = new HaShiQi('哈士奇','黑色','拆家');
// 呼叫子類
dog1.run();
const dog2 = new KeJi('柯基','黃色','接飛碟');
dog2.go();
dog2.bark();
代碼中,創建了Dog的父類,然后分別創建HaShiQi和KeJi類繼承Dog類的屬性和方法,創建了dog1和dog2兩個實體,運行結果如下,

在這里先啰嗦一下,畢竟會有一些剛入門的小白對ES6的語法還不是很了解:
1.console.log()陳述句里面用到了“` `”模板字串,它可以當作普通字串使用,也可以用來定義多行字串,或者在字串中嵌入變數,類的屬性通過${}來引入,
2.子類通過extends陳述句繼承父類的屬性和方法,通過super陳述句接收屬性,方法直接呼叫即可,
原型
instanceof
我們平常判斷變數的型別常常會用到typeof運算子,但是判斷參考型別常常會回傳object,不信?這里有圖有真相!

所以我們接下來用到的instanceof 通過回傳一個布林值來表明,某個物件是否是某個特定類或者是該特定類的子類的一個實體,

第五行陳述句可能會有同學有疑問,為什么布林值會是true?答案很簡單,Object是所有類的祖先,上述類代碼按照輩分來排列,應該是:Object---Dog---HaShiQi/KeJi ,所以instanceof就像DNA技術一樣,來判斷是否為某個類或者為某個類的父類(注意:instanceof只能用來判斷參考型別)
prototype
在說明這玩意之前,我給大家先放一張圖:

我們稱__proto__為隱式原型,prototype為顯式原型,上述圖片體現出,實體的隱式原型指向類的顯式原型,原型這個概念對于初學者來說比較難懂,博主也是花了不少時間才搞懂它,先放一張思維導圖給大家看看他們之間的關系,

從圖中我們可以看到,我們定義了一個物件HaShiQi,然后把物件的方法存盤HaShiQi.prototype里面,通過new HaShiQi宣告出dog1實體以后,屬性name、color、hobby是存盤在dog1實體里面,run()方法本身不在dog1實體里面,所以就需要通過__proto__隱式原型指向HaShiQi.prototype顯式原型來獲取的,
敲黑板記筆記:
1.每個class都有顯式原型prototype
2.每個實體都有隱式原型__proto__
3.實體的__proto__指向class的prototype
4.執行規則先從自身尋找有沒有該屬性和方法,沒有就去__proto__去尋找
原型鏈
有了這層知識以后,接下來給大家看看一張勁爆的圖

簡單來說,就是HaShiQi類繼承Dog類,Dog類繼承Object類,Object.prototype提供js內置的方法hasOwnProperty,這個就是js呼叫機制的底層本質,
hasOwnProperty
該方法是js內置提供的方法,它用來判斷該實體有沒有這個屬性,我們從控制臺了解到,dog1擁有color這個屬性,但是沒有run()方法,怎么辦呢?所以我們就要從隱式原型去尋找run()方法,

同學們學廢了嗎?

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323462.html
標籤:其他
下一篇:React 表格內自定義組件不進行實時更新,采用更新key方式實時更新組件,以及直接變更開關 defaultChecked 為 checked 狀態實作表格組件更新
