以下~this
var str = 'hello'; //string 基本類型 var s2 = str.charAt(0); alert(s2); // h
毫無疑問上面的string是一個基本類型,可是它卻能召喚出一個 charAt() 的方法,這是什麼緣由呢?
主要是由於在基本類型中,有三個比較特殊的存在就是:String Number Boolean,這三個基本類型都有本身對應的包裝對象。而且隨時等候召喚。包裝對象呢,其實就是對象,有相應的屬性和方法。至於這個過程是怎麼發生呢,實際上是在後臺偷偷發生的。prototype
//咱們日常寫程序的過程: 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
注意這是一瞬間的動做 實際上咱們沒有改變字符串自己的值。就是作了下面的動做.這也是爲何每一個字符串具備的方法並無改變字符串自己的緣由。code
由此咱們能夠知道,引用類型和基本包裝對象的區別在於:生存期
引用類型所建立的對象,在執行的期間一直在內存中,而基本包裝對象只是存在了一瞬間。對象
因此咱們沒法直接給基本類型添加方法:內存
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 這個對象又被銷燬 }
那麼咱們怎麼才能給基本類型添加方法或者屬性呢?
答案是在基本包裝對象的原型下面添加,每一個對象都有原型。字符串
//給字符串添加方法 要寫到對應的包裝對象的原型下才行 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; // 這個對象被銷燬 }