內建函式建構子
前一堂課介紹了透過函是來建立物件的函式建構子 Function Constructor
,這堂課將進一步介紹”內建”的函式建構子
new Number()
直接看到一段範例如下:
透過內建的函式 Number
來建立一個物件,內建的 Function Constructor
也有按照大寫開頭的慣例
1 | var a = Number(3); |
當我們透過瀏覽器的 console
查看 a
的值時,它不是一個數字 number
,還記得前面提到 function constructor
會建立的會是一個物件,所以得到的 a
會是一個包含數字 3
的 object
。
透過這些內建的 function constructor
所建立的物件會有一些內建的 method
可以使用,只要在瀏覽器的 console
中透過 Number.prototype
就可以查看
1 | a.toString(); // '3' |
不透過關鍵字 new
我們也可以單純使用 Number()
來將 String
轉為 Number
1 | var a = Number('3'); |
new String()
接著看到第二個範例:
我們透過 String
來建立一個新的物件
1 | var a = new String('John'); |
透過 function constructor
所建立的 object
同樣會有一些預設的 method
,同樣可以透過 String.prototype
來查看,但如果直接這麼使用會發現結果不如預期
1 | String.prototype.indexOf('o'); // -1 |
總結以上兩個範例,不管使用的 function constructor
是哪一種,所建立的只是長得像原始型別 primitive
的 object
,並提供許多預設的 method
供我們使用。
另外有一點很重要的是,我們在開發時常透過 .length
來取得字串的長度,但仔細想想,字串 String
是原始型別 primitive
,並不是 object
,所以並不會有 property
和 method
,但當我們對 primitive
的值這麼做時,JavaScript
會自動幫你的值進行物件般的處理,如下:
1 | console.log('John'.length); // 4 |
為內建的 Function Constructor 新增屬性和方法
當我們透過內建的 function constructor
建立物件時,會有許多預設的屬性和方法供我們使用,但在 JavaScript
中能做的不僅如此,我們還可以在這些內建的 function constructor
上新增屬性和方法
1 | String.prototype.isLengthGreaterThan = function(limit) { |
在上面的範例中,我們在 String.prototype
上新增一個方法 isLengthGreaterThan
,其函式中的 this
就是新建立的物件,而這裡則是 John
這個字串被當作物件般處理,結果是 4 > 3
,所以回傳 true
。
自動將原始型別轉為物件處理
那麼如果我們對數字 number
也這麼做會得到什麼呢 ?
1 | Number.prototype.isPositive = function() { |
結果會得到 error
,因為 JavaScript
只會將字串 String
自動轉為物件般處理,所以如果是其他原始型別,只能透過 function constructor
建立物件才能為它擴充屬性與方法。
1 | var a = new Number(3); |
避免都使用 Function Constructor 建立原始值
即便以上透過 function constructor
來建立原始值的物件看似方便好用,但在開發時,除非你很清楚這麼做的目的,否則都建議直接使用原始型別來建立,讓我們透過一段範例來了解為什麼要這麼做。
首先,分別使用 primitive
和 function constructor
來建立數字 3
,當我們透過雙等號 ==
比較時,會得到 true
,因為透過 ==
比較時,JavaScript
會發現等號兩側不同型別,因此會幫我們自動轉型,所以得到 true
的結果,反之三等號 ===
不會自動轉型,所以得到 false
。
1 | var a = 3; |
所以在開發時,使用 function constructor
必須有很明確的目的,否則盡量單純使用 primitive
建立原始值即可
Moment.js
這裡介紹一個處理 Date
很有名的 Library
- Moment.js,它就是透過 Date
這個 function constructor
提供許多關於日期的方法。