Open LeoWangJ opened 4 years ago
先看一個例子:
let n = 1 n.toString() // 印出 "1"
直接印出n的值時也沒有看到有任何的prototype可以使用,那為什麼n可以使用到toString方法呢? 而且n是一個基本類型怎麼能夠使用物件的方法呢?
首先我們要先說明let n = new Number(1)與 let n = 1 的差別。
使用new Number 會創建一個物件,而這個物件會擁有Number的prototype且Number的prototype又指向Object的prototype,所以使得我們可以同時使用Number與Object的prototype。
let n = new Number(1) n -----> Number.prototype -----> Object.prototype
而使用let n = 1 時,他並不會生成一個物件,所以JS作者就用了一個方法解決這個問題。 就是當基本類型要使用prototype的東西時,會去new一個對應類型的物件,這個物件會提供n取得protoype的方法,等到取用結束後這個物件就會釋放掉避免佔太多記憶體。
再看一個例子:
let n = 1 n.xxx = 2 console.log(n.xxx) // undefined
由於上面我們已經說過當要對基本類型進行物件的操作時,會先創建一個暫時的物件且當操作結束後該物件就會被釋放掉,所以要再次調用n.xxx時就會是undefined。
先看一個例子:
直接印出n的值時也沒有看到有任何的prototype可以使用,那為什麼n可以使用到toString方法呢?
而且n是一個基本類型怎麼能夠使用物件的方法呢?
首先我們要先說明let n = new Number(1)與 let n = 1 的差別。
使用new Number 會創建一個物件,而這個物件會擁有Number的prototype且Number的prototype又指向Object的prototype,所以使得我們可以同時使用Number與Object的prototype。
而使用let n = 1 時,他並不會生成一個物件,所以JS作者就用了一個方法解決這個問題。
就是當基本類型要使用prototype的東西時,會去new一個對應類型的物件,這個物件會提供n取得protoype的方法,等到取用結束後這個物件就會釋放掉避免佔太多記憶體。
再看一個例子:
由於上面我們已經說過當要對基本類型進行物件的操作時,會先創建一個暫時的物件且當操作結束後該物件就會被釋放掉,所以要再次調用n.xxx時就會是undefined。