顯示具有
[Web][JavaScript]其它 標籤的文章。
顯示所有文章
顯示具有
[Web][JavaScript]其它 標籤的文章。
顯示所有文章
- 假設有兩種車輛的class,有部分功能不同,但也有許多一樣的部分
- 可以把功能相同的部分抽到Car這個Superclass,Van跟Cop是Subclass,它們去產生一個Car物件,並且在這個物件上作其他功能的新增
- 如果是用new產生的物件呢?
- Car是Superclass,Van是Subclass,Subclass的實作有幾點要注意
- 使用Car.call( )將Car用到的this改綁成Van的this
- 使用Object.create()將Van.prototype可以Delegate Car.prototype,形成Prototype Chain,如此一來Van物件才能使用Car的move method
- 由於Van.prototype重設了,則Van.prototype.constructor會變成空的,所以也要重新將它設成Van
- Van.prototype.grab的設定代表可以新增methods的能力
參考資料
https://classroom.udacity.com/courses/ud015
- 若有用new來產生物件的話,JavaScript會自動加入兩行程式碼
- 所以將重複的部分刪掉後,實際上需要留下的程式碼如下
- 有new和之前沒有new的做法的差別在於用new的話JavaScript會多做一些效能優化
參考資料
- 下面的Code會有一個效能的問題,每產生一個Car物件,都會複製一份methods過去
- 一個做法是使用Object.create()創造物件,就會有Prototype Chain的特性,將Car.methods帶入Object.create()中,如此一來這個Car.methods就只會有一份,所產生的每一個Car物件都會reference到同一個Car.methods
- 有鑑於這種方式太常用,JavaScript在Object的constructor提供一個叫prototype的property,讓開發者可以將methods儲存在裡面
- prototype這個property裡面會有constructor,指回該物件,下面的例子中Car.prototype.constructor就是指回Car
- amy.constructor會透過Prototype Chain往上找到Car.prototype,所以也是指到Car
- 使用instanceof operator可以看出amy是Car的instance無誤
- 而下面的例子中,instanceof的結果會是False,這是因為fido是一個function物件,它的上一層是Object Prototype,Dog並不會在fido的Prototype Chain之中
參考資料
https://classroom.udacity.com/courses/ud015
- 物件的複製有兩種方法
- 建立一個空物件,將舊的物件內容一個個copy過去
- 使用Object.create(舊物件)產生
- 這兩者的差別在於:
- 建立一個空物件,將舊的物件內容一個個copy過去
- 使用Object.create(舊物件)產生
- 產生Prototype Chain,若新物件沒有該資料,會到舊物件查詢
- 所有物件都會有一個最上層的Prototype,稱之為Object Prototype
- Prototype會定義一些function可以使用
- Array則會多一層Array Prototype,這個Array Prototype的上一層也會連到Object Prototype
參考資料
https://classroom.udacity.com/courses/ud015