[JavaScript] 忍之道解謎(三) - Constructor Invocation Pattern
Q. typeof b = ?
JavaScript 是種 prototypal inheritance的語言,有別於目前主流的 classical 語言,它的繼承是以 prototype 的概念來實現。new Constructor(args...){ .... } 這個敘述對於物件導向語言並不陌生,它代表建立一個類別物件的實體,JS 雖然沒有類別的概念,但它仍然有 new 這個陳述式:
執行 new Constructor([arguments]) 即會建立一個該類型物件實體,該物件會繼承 Function.prototype 的屬性成員並將 this 指向新建立的物件。
下面將以一個例子說明 constructor invocation 如何建立 Duck 類型物件的實體並動態加入quack 行為:
duck物件的 Constructor 在呼叫時會帶入一個參數作為其 name 屬性的值,並且在 duck1, duck2 兩個實體建立後,再加動態為其加入 quack 的行為。
這題在一開始定義了 a 類型物件的 constructor,裡面未定義任何成員屬性,之後再透過 new 建立了一個 a 物件實體並把 b 指向它,所以答案 b 是一個 Object。
JavaScript 是種 prototypal inheritance的語言,有別於目前主流的 classical 語言,它的繼承是以 prototype 的概念來實現。new Constructor(args...){ .... } 這個敘述對於物件導向語言並不陌生,它代表建立一個類別物件的實體,JS 雖然沒有類別的概念,但它仍然有 new 這個陳述式:
new Constructor([arguments]) - 用來建立一個自定義物件的實體或是一個有定義 Constructor 的內建物件,Constructor 為 function object ,代表產生出來的物件類型。Constructor 定義的是該類型物件的名字與所擁有的屬性、方法,其實就很像 Class 宣告,不同的地方在於物件可以很輕鬆的透過 Function.prototype 動態的加入屬性、方法 ( JS 的物件在乎的是擁有什麼行為而不是它的身世),所以該類型物件在執行期間馬上就擁有這些新的行為,不需要重新建立實體。
執行 new Constructor([arguments]) 即會建立一個該類型物件實體,該物件會繼承 Function.prototype 的屬性成員並將 this 指向新建立的物件。
下面將以一個例子說明 constructor invocation 如何建立 Duck 類型物件的實體並動態加入quack 行為:
duck物件的 Constructor 在呼叫時會帶入一個參數作為其 name 屬性的值,並且在 duck1, duck2 兩個實體建立後,再加動態為其加入 quack 的行為。
這題在一開始定義了 a 類型物件的 constructor,裡面未定義任何成員屬性,之後再透過 new 建立了一個 a 物件實體並把 b 指向它,所以答案 b 是一個 Object。
留言
張貼留言