(Day 20) Object.create 建立多層繼承
前言
上回介紹了如何使用建構式來建立原型,接著今天介紹使用 Object.create()
建立多層原型,先前在 T Shirt 例子有提到 , T Shirt 的原型是衣服,而衣服原型,仍然能有原型,這種多層原型就會使用 Object.create()
這個方法。
什麼是 Object.create()
Object.create()
這個功能簡單來說就是,建立一個新的原型物件,而這個原型物件是沒有實體的,這邊使用範例來觀察
1 | const Ryder = { |
雖然 student
實體仍是空物件,但我們使用 student.name
可以看到他會回傳 Ryder
這是因為 Object.create()
的功能,讓 student
的原型繼承 Ryder
的內容 ,可以點開 student
回傳的空物件,看看他 [[Prototype]]
的結構:
這樣便清楚 Object.create()
的功能其實就是能夠讓參數中的內容,成為目標的原型。
透過 Object.create() 建立多層原型
這邊複製之前的 TShirt
程式碼
1 | function TShirt(color,material,size){ |
目前是的原型鍊是
BlackTShit (子層) ⇒ TShirt (父層)
預期在 TShirt 上一層在新增一層 apparel
原型,也就是讓原型鍊變成
BlackTShit ⇒ TShirt ⇒ apparel (服飾)
接下來就是新增 apparel
原型,並使用剛剛介紹的 Object.create()
, 讓 apparel
成為 TShirt
的原型,以下是範例:
1 | // 新的一層原型 |
在這段範例中要特別注意的是這一段:
1 | TShirt.prototype = Object.create(apparel.prototype) |
這邊是讓 TShirt
這個函式建構式的原型,繼承了 apparel
函式就建構式的原型。
多層繼承中的眉眉角角
在完成上面使用 Object.create()
串連原型後,接著試者使用 mirror()
以及 clothe()
方法。
1 | BlackTShit.clothe() //穿上 black T Shit |
可以發現在 apparel
這一層原型新增的方法雖然成功了, mirror()
方法中的 type
屬性卻無法正確顯示,這是因為使用 Object.create()
讓 TShirt
繼承了 apparel
的原型,但卻沒有繼承 apparel
的『建構函式』。
這時候需要在 TShirt
建構函式中使用 call()
方法,來讓 TShirt
中的 this
綁定到 apparel
上,而這段其實就是將兩個 建構函式 串接起來,並在傳入 'T Shirt'
字串當作 apparel
的 type
參數。
1 | function apparel(type){ |
這樣在 console 打上 BlackTShit
便會看到,來自 TShirt
原型 、apparel
原型上的完整屬性以及內容了。
最後這邊看起來程式碼已經相當的完整了,但是如果要讓原型鍊完整的話,其實還必須在 Object.create()
底下加上 TShirt.prototype.constructor = TShirt
,這是因為在 Object.create()
設定時就會將原本 TShirt
原型中的內容在加回來。
1 | function apparel(type){ |
這樣就是完整的讓原型繼承原型的方法了。
參考文獻
- JavaScript 核心篇 (六角學院)