[JavaScriptWeird]No.47 觀念小叮嚀:內建的函式建構子(一)

前言

現在我們已經知道函式建構子了, JavaScript 有一些內建的函式建構子,可以在這篇討論一下,而這些內建的函式建構子大多也都遵循傳統首字母大寫

內建的函式建構子

首先打開 chrome 的開發者工具,不需要自行撰寫程式碼,因為有些函式以及函式原型已經存在,所以可以直接測試。

Number() 是 JavaScript 內建的函式建構子,遵循了首字母大寫的傳統,這邊要注意的是 a 並不是一個純數值,而是一個物件裡面包著純值 3 。

因為 Number() 是一個物件,所以它有原型,順著觀察下去:

可以看到有許多的方法,所以 Number 物件都可以取用到這些方法,像是裡面的 toFixed() ,因此可以這麼用:

試試另一個內建的函式建構子 String

用同樣的做法讓 「a.」能夠取用到一堆在字串上能用的方法。

這些方法並不再 a 上,而是在 String 的原型上。舉例來說,像是:

我使用了 .indexOf("J") 尋找字串中是否有這個字母,回傳 0 代表 J 在第 0 個位址。

要特別注意的是,這裡的 a 並不是字串,這與上一個範例相同,a 是一個物件。

上面的兩個例子看起來起手都像是在建立純值,但其實我們是在建立一個物件,而這個物件包含了純值以及一些額外功能。

另外某些例子中 JavaScript 允許這樣子做,它會知道我們要物件而不是純值:

「.」前面的 John 是個純值,但 JavaScript 自動把它放入字串物件中,讓我們能使用 length 方法。

就類似於這樣:

1
new String("John")

然後再對它做 length 方法。

但並不是所有內建的函式建構子都能這麼做,像是:

在有了原型、原型鏈、函式建構子的觀念後,我們甚至可以在內建的函式建構子上額外擴充一些方法,像是增加一個方法給所有字串:

1
2
3
4
5
String.prototype.isLengthGreaterThan = function(limit) {  
return this.length > limit;
}

console.log("John".isLengthGreaterThan(3)); // true

純值字串 John 被字串原型函式轉換成字串物件,並且取用了我們新增於字串原型上的 isLengthGreaterThan 方法。

而且之後所有的字串都可以取用這個方法,這是相當強大的!

嘗試對 Number 增加一個方法:

1
2
3
Number.prototype.isPositive = function() {  
return this > 0;
}

如同上面的範例, JavaScript 雖然會幫我們轉換字串但不會轉換數值,所以仍然要使用函式建構子,然後呼叫我們新增的 isPositive 方法。

如果要處理這些被函式建構子所建立的東西,觀念不清楚是相當危險的,畢竟它們很像純值但實際上是物件。

下一篇要來了解為什麼危險以及正確的觀念為何?

0%