今天會用圖解來表示 Prototype Chain,
不過開始之前,先整理一下會用到 component:
還是強調是 JavaScript ,
所以 JavaScript 內,所有的 function 其實 top level type 都是 object 。
這邊只是故意用 method 來讓大家可以比較清楚。
左上: 有一個 Function 叫做 Object
右上: 有一個 Function 的 method 叫做 prototype
左下: 有一個 Object 叫做 (empty)
右下: 有一個 Object 的 property 叫做 constructor
Object
太難找的合適的名字,所以通常都直接用行為描述這個 最重要的 Object,
它是一個 build-in function 的屬性,透過呼叫prototype
method 來找到這個很重要的 Object 。
舉例而言,這個很重要的東西就直接叫做 Object.prototype
,其中可能有
Object.prototype
也可以指向原本的 Object
,這個名字就很尷尬,因為命名試圖想抽象細節,取一個很常用的名字。constructor
我們有一個 Workshop
function , 所以會有一個橢圓形名字是 Workshop
。
有另一個 Object
也很重要,但是 code 裡面不明顯,
因為太重要,還想不出好的方法命名,就先以如何使用
它當作命名。
它們的關係是可以透過 prototype
連接,所以叫做 Workshop.prototype
。
目前是 line 1
所以裡面還是空的。
還有一個反向的關係,名字很容易讓人混淆。
當這樣的關係建立起來,還有一個隱藏的關係:
這個稍後會提到。
這邊描述會加上一個 property ,叫做 ask
,只有這樣。
[day24] YDKJS (Objects) : 「this」 是 JavaScript 使用 Dynamic scope 的方法? 這天有提到,看到 new
會有 4 種方法可以處理,幫大家複習一下。
Kyle 整理 new keyword 的行為
我們這邊就要實作這 4 件事。
連結(Link)創造的物件到另一個物件。
把之前 call 的 this , 設定到這個物件上。
之前在 line 2 有 call
this
, property 是 teacher
function 都要 return
,這邊的 return 就是名字 deepJs
基本上差不多,就直接畫結論不分解了。
要執行 deepJS.ask
,請問我們畫的 deepJS 上面有 ask 嗎?
NO。
這時候不會報錯,但如果用錯誤的 Class 思維
去想,會想成複製一個新的 instance ,所以上面有 ask, 這是錯的。
真正的狀況是,我們圖上有虛線連接,我們會跟著虛線往上找,這樣的虛線我們叫做 prototype chain
, 實際 Spec. 描述上會寫成 [[prototype]]
。
所以 line 11 上面的 deepJS 沒有,沿著虛線找看到 ask
所以不會報錯。
這個找到的東西是 Workshop.prototype
,在 line 5
的時候定義的方法,
會做 console.log(this.teacher , question )
。
這時候看到一個神奇的現象, 這邊的 this
是由 誰呼叫
來決定的,*之前提到的規則
第三點。
*註:之前提到的規則
參考 [day24] YDKJS (Objects) : 「this」 是 JavaScript 使用 Dynamic scope 的方法?
- 數字代表優先程度 (數字 1 最優先)
所以這邊的最開始呼叫的地方還是第 11 行。
line 11 傳入的 this 在 line 8 創造,參數是 "Kyle"
所以這邊的 this 是 "Kyle"
邏輯是一樣的,這邊簡化
Workshop.prototype
有 askWorkshop.prototype
的 ask ,也就是 line 5 : console.log(this.teacher , question )
最開始誰呼叫
的地方決定,所以 this 還是 reactJS"Suzy"
以一開始的自己
為主,和虛線連到的地方沒有關係。