天天看點

《JavaScript面向對象精要》——1.4 内建類型執行個體化

本節書摘來自異步社群《javascript面向對象精要》一書中的第1章,第1.4節,作者:【美】nicholas c. zakas著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

你已經見過如何用new object()建立和使用通用對象。object類型隻是javascript提供的少量内建引用類型之一。其他内建類型各有它們的特殊用途,可在任何時候被執行個體化。

這些内建類型如下。

array   數組類型,以數字為索引的一組值的有序清單

date   日期和時間類型

error   運作期錯誤類型(還有一些更特别的錯誤的子類型)

function 函數類型

object  通用對象類型

regexp  正規表達式類型

可以用new來執行個體化每一個内建引用類型,如下。

1.4.1 字面形式

内建引用類型有字面形式。字面形式允許你在不需要使用new操作符和構造函數顯式建立對象的情況下生成引用值(你曾在本章前面見過原始類型的字面形式,包括字元串、數字、布爾、空類型和未定義)。

要用對象字面形式建立對象,可以在大括号内定義一個新對象及其屬性。屬性的組成包括一個辨別符或字元串、一個冒号以及一個值。多個屬性之間用逗号分隔。例如,

屬性名字也可以用字元串表示,特别是當你希望名字中包含空格或其他特殊字元時。

本例等價于前例,僅在文法上有所差別。下例是另一種等價寫法。

上述3例的結果是一緻的:一個具有兩個屬性的對象。寫法完全取決于你。

注意:

雖然使用字面形式并沒有調用new object(),但是javascript引擎背後做的工作和new object()一樣,除了沒有調用構造函數。其他引用類型的字面形式也是如此。

定義數組的字面形式是在中括号内用逗号區分的任意數量的值。例如,

這段代碼等價于:

1.4.3 函數字面形式

基本上都要用字面形式來定義函數。考慮到在可維護性、易讀性和調試上的巨大挑戰,通常不會有人使用函數的構造函數,是以很少看到用字元串表示的代碼而不是實際的代碼。

使用字面形式建立函數更友善也更不容易出錯,如下例。

這段代碼定義了reflect()函數,它的作用是将任何傳給它的參數傳回。即使是這樣一個簡單的例子,使用字面形式都比構造函數的形式友善和易讀。另外,用構造函數建立的函數沒什麼好的調試方法:javascript調試器認不出這些函數,它們在程式裡就好像黑盒一樣。

1.4.4 正規表達式字面形式

javascript允許用字面形式而不是使用regexp構造函數定義正規表達式。它們看上去類似perl中的正規表達式:模式被包含在兩個“/”之間,第二個“/”後是由單字元表示的額外選項。例如,

使用字面形式比較友善的一個原因是你不需要擔心字元串中的轉義字元。如果使用regexp構造函數,傳入模式的參數是一個字元串,你需要對任何反斜杠進行轉義(這就是為什麼字面形式使用“d”而構造函數使用“\”d的原因)。在javascript中,除非需要通過一個或多個字元串動态構造正規表達式,否則都建議使用字面形式而不是構造函數。

總之,除了函數,對内建類型沒什麼正确或錯誤的執行個體化方法。很多開發者喜歡字面形式,另一些則喜歡用構造函數。你可以選擇能令你覺得更舒服的那種。

繼續閱讀