今天來討論一下JS中的基本包裝對象(也叫基本包裝類型),以前剛學到這裏的時候,本身也是一頭霧水,不明白這個基本包裝對象究竟是個什麼鬼,後來找了不少資料,終於看清了它的真面目。首先呢,咱們如今複習一下JS的數據類型,JS數據類型被分爲了兩大門派,基本類型和引用類型。this
基本類型:`Undefined`,`Null`,`Boolean`,`Number`,`String` 引用類型:`Object`,`Array`,`Date`,`RegExp`等,說白了就是對象。。。
咱們都知道,引用類型有方法和屬性,可是基本類型是木有的,可是你必定見過這樣的代碼prototype
var str = 'hello'; //string 基本類型 var s2 = str.charAt(0); alert(s2); // h
毫無疑問上面的string
是一個基本類型,可是它卻能召喚出一個charAt()
的方法,這是什麼緣由呢?code
主要是由於在基本類型中,有三個比較特殊的存在就是:String
Number
Boolean
,這三個基本類型都有本身對應的包裝對象。而且隨時等候召喚。包裝對象呢,其實就是對象,有相應的屬性和方法。至於這個過程是怎麼發生呢,實際上是在後臺偷偷發生的。對象
來看個栗子內存
//咱們日常寫程序的過程: var str = 'hello'; //string 基本類型 var s2 = str.charAt(0); //在執行到這一句的時候 後臺會自動完成如下動做 : //至關於: ( var str = new String('hello'); // 1 找到對應的包裝對象類型,而後經過包裝對象建立出一個和基本類型值相同的對象 var s2 = str.chaAt(0); // 2 而後這個對象就能夠調用包裝對象下的方法,而且返回結給s2. str = null; // 3 以後這個臨時建立的對象就被銷燬了, str =null; ) ` alert(s2);//h alert(str);//hello 注意這是一瞬間的動做 實際上咱們沒有改變字符串自己的值。就是作了下面的動做.這也是爲何每一個字符串具備的方法並無改變字符串自己的緣由。
由此咱們能夠知道,引用類型和基本包裝對象的區別在於:生存期
字符串
引用類型所建立的對象,在執行的期間一直在內存中,而基本包裝對象只是存在了一瞬間。原型
因此咱們沒法直接給基本類型添加方法:string
舉個栗子io
var str = 'hello'; str.number = 10; //假設咱們想給字符串添加一個屬性number ,後臺會有以下步驟 // 至關於 { var str = new String('hello'); // 1 找到對應的包裝對象類型,而後經過包裝對象建立出一個和基本類型值相同的對象 str.number = 10; // 2 經過這個對象調用包裝對象下的方法 但結果並無被任何東西保存 str =null; // 3 這個對象又被銷燬 } alert(str.number); //undefined 當執行到這一句的時候,由於基本類型原本沒有屬性,後臺又會從新重複上面的步驟 //至關於 { var str = new String('hello'); // 1 找到基本包裝對象,而後又新開闢一個內存,建立一個值爲hello對象 str.number = undefined // 2 由於包裝對象下面沒有number這個屬性,因此又會從新添加,由於沒有值,因此值是未定 ;而後彈出結果 str =null; // 3 這個對象又被銷燬 }
那麼咱們怎麼才能給基本類型添加方法或者屬性呢?ast
答案是在基本包裝對象的原型下面添加,每一個對象都有原型。
來看個栗子
//給字符串添加方法 要寫到對應的包裝對象的原型下才行 var str = 'hello'; String.prototype.last= fuction(){ return this.charAt(this.length); }; str.last(); // 5 執行到這一句,後臺依然會偷偷的幹這些事 //至關於 { var str = new String('hello');// 找到基本包裝對象,new一個和字符串值相同的對象, str.last(); // 經過這個對象找到了包裝對象下的方法並調用 str =null; // 這個對象被銷燬 }
看註釋相信能看出建立在基本包裝對象原型下面的方法和屬性才能被保存。