[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。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function a(){}; | |
b = new a(); |
new Constructor([arguments]) - 用來建立一個自定義物件的實體或是一個有定義 Constructor 的內建物件,Constructor 為 function object ,代表產生出來的物件類型。Constructor 定義的是該類型物件的名字與所擁有的屬性、方法,其實就很像 Class 宣告,不同的地方在於物件可以很輕鬆的透過 Function.prototype 動態的加入屬性、方法 ( JS 的物件在乎的是擁有什麼行為而不是它的身世),所以該類型物件在執行期間馬上就擁有這些新的行為,不需要重新建立實體。
執行 new Constructor([arguments]) 即會建立一個該類型物件實體,該物件會繼承 Function.prototype 的屬性成員並將 this 指向新建立的物件。
下面將以一個例子說明 constructor invocation 如何建立 Duck 類型物件的實體並動態加入quack 行為:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Duck = function(name){ | |
this.name = name; | |
} | |
var duck1 = new Duck("jimmy"); | |
var duck2 = new Duck("chickenrice"); | |
console.log("duck1's name: "+duck1.name); // duck1's name: jimmy | |
console.log("duck2's name: "+duck2.name); // duck2's name: chickenrice | |
Duck.prototype.quack = function(){ | |
console.log(this.name+" : quack! quack!"); | |
} | |
duck1.quack(); //jimmy: quack! quack! | |
duck2.quack(); //chickenrice: quack! quack! |
這題在一開始定義了 a 類型物件的 constructor,裡面未定義任何成員屬性,之後再透過 new 建立了一個 a 物件實體並把 b 指向它,所以答案 b 是一個 Object。
留言
張貼留言