顯示具有 [Web][JavaScript]其它 標籤的文章。 顯示所有文章
顯示具有 [Web][JavaScript]其它 標籤的文章。 顯示所有文章

2017年8月18日 星期五

Superclasses and Subclasses


  • 假設有兩種車輛的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












Pseudoclassical Patterns


  • 若有用new來產生物件的話,JavaScript會自動加入兩行程式碼


  • 所以將重複的部分刪掉後,實際上需要留下的程式碼如下


  • 有new和之前沒有new的做法的差別在於用new的話JavaScript會多做一些效能優化

參考資料












Prototypal Classes


  • 下面的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










2017年8月17日 星期四

Prototype Chain


  • 物件的複製有兩種方法
    • 建立一個空物件,將舊的物件內容一個個copy過去
    • 使用Object.create(舊物件)產生
  • 這兩者的差別在於:
    • 建立一個空物件,將舊的物件內容一個個copy過去
      • 保存的是複製當下舊物件的內容
    • 使用Object.create(舊物件)產生
      • 產生Prototype Chain,若新物件沒有該資料,會到舊物件查詢
        • 如下面例子的最後一行會印出3


  • 所有物件都會有一個最上層的Prototype,稱之為Object Prototype
    • Prototype會定義一些function可以使用
  • Array則會多一層Array Prototype,這個Array Prototype的上一層也會連到Object Prototype




參考資料

https://classroom.udacity.com/courses/ud015