本日来讨论一下JS中的基础包装对象(也叫基础包装范例),之前刚学到这里的时刻,自身也是一头雾水,不明白这个基础包装对象究竟是个什么鬼,厥后找了许多材料,终究看清了它的真面目。起首呢,我们如今温习一下JS的数据范例,JS数据范例被分为了两大门派,基础范例和援用范例。
基础范例:`Undefined`,`Null`,`Boolean`,`Number`,`String`
援用范例:`Object`,`Array`,`Date`,`RegExp`等,说白了就是对象。。。
我们都晓得,援用范例有要领和属性,然则基础范例是木有的,然则你肯定见过如许的代码
var str = 'hello'; //string 基础范例
var s2 = str.charAt(0);
alert(s2); // h
毫无疑问上面的string
是一个基础范例,然则它却能招呼出一个charAt()
的要领,这是什么缘由呢?
重要是由于在基础范例中,有三个比较特别的存在就是: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 注重这是一瞬间的行动 实际上我们没有转变字符串自身的值。就是做了下面的行动.这也是为何每一个字符串具有的要领并没有转变字符串自身的缘由。
由此我们能够晓得,援用范例和基础包装对象的区分在于:生存期
援用范例所建立的对象,在实行的时期一直在内存中,而基础包装对象只是存在了一瞬间。
所以我们没法直接给基础范例增加要领:
举个栗子
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; // 这个对象被烧毁
}
看解释置信能看出建立在基础包装对象原型下面的要领和属性才被保留。