今天来讨论一下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; // 这个对象被销毁 }
看注释相信能看出建立在基本包装对象原型下面的方法和属性才能被保存。