JS的數據類型:
基本類型:Undefined, Null, Boolean, Number, String
引用類型:Object, Array, Date, RegExp (其實就是對象)
JS中只有對象才有屬性和方法,原始值沒有屬性和方法
那么我們平常求字符串的長度 用length屬性不是沒有問題嗎?
var str="hello world"; var long=str.length; console.log(long); //得出結果為11
這是因為js中提供了三種特殊的引用類型(String Number Boolean)每當我們給原始值賦屬性值時 后台都會給我們偷偷轉換 調用包裝類
怎么進行“包裝”的?
舉個例子 用事實說話吧:(注釋的部分就是后台為我們偷偷干的事)
var str="hello word"; //var str = new String("hello world"); // 1.創建出一個和基本類型值相同的對象 //var long = str.length; // 2.這個對象就可以調用包裝對象下的方法,並且返回結給long變量 //str = null; // 3.之后這個臨時創建的對象就被銷毀了 var long=str.length; //因為str沒有length屬性 所以執行這步之前后台會自動執行以上三步操作 console.log(long); // (結果為:10) //var str = new String("hello word"); // 1.因為下面有輸出創建出str.length 而str不應該具有length這個屬性 所以再次開辟空間創建出一個和基本類型值相同的對象 //str.length=nudefined; // 2.因為包裝對象下面沒有length這個屬性沒有值,所以值是未定 //str = null; // 3.這個對象又被銷毀了 console.log(str.length) // (結果為:undefined)
給基本類型添加屬性和方法:
可是我們如果想給基本類型添加屬性和方法,又該怎么辦呢?
可以在基本包裝類的原型上實現:
當然 如果要計算字符串的長度這是完全沒有必要的,你使用length屬性就可以了 這里只是展示了一種 給基本類型添加屬性的方法
//給字符串添加方法 要寫到對應的包裝對象的原型下才行 var str= "hello world"; //若我們想在原型上設置一個屬性long 保存字符串的長度 //var str = new String("hello world");// 1.找到基本包裝對象,創建一個和字符串值相同的對象, //String.prototype.long=str.length; // 2.通過這個對象找到了包裝對象下的方法並調用 //str=null; // 3.這個剛創建的對象被銷毀 String.prototype.long=str.length;// 執行到這一句,同樣因為沒有length屬性 后台會偷偷的執行上述三步操作 console.log(str.long); //結果為:11
注意:這樣因為你是給基本類型string的原型上添加的屬性,所以任意一個字符串都可以訪問到這個屬性及此值。(所以不提倡這種做法)
var str= "hello world"; var str2="哈哈 我的長度也為11嗎?"; String.prototype.long=str.length; console.log(str2.long); //結果為:11