天天看点

JavaScript什么是包装对象

<script>var str = 'hello';
        // 1、首先我们测一下str的数据类型
        alert(typeof str); // string 字符串类型
        /* * * * * * * * * * * * * * * * * * * * * * * * * * *
         * 既然是字符串类型,为什么又会有方法呢?               
         * 我们知道方法前面必须是对象,也就是对象才有方法       
         * 基本类型是不能拥有方法的                          
         * 如果要是有方法的话,那么在源码当中应该怎么写?       
         * 我们此前都知道方法应该写在构造函数对应的原型下面     
         * * * * * * * * * * * * * * * * * * * * * * * * * * */
        str.charAt(0);
        str.indexOf('e')
</script>      

今天我们聊聊基本类型为何会有方法,原型当中是如何设计的?

这就涉及到我们今天说的内容 包装对象

包装对象 :基本类型有自己对应的包赚对象,但是null和indefine是没有包装对象的

基本类型有:字符串 数字 布尔值 null undefine

字符串的包装对象是 String

数字的包装对象是 Number

布尔值的包装对象是 Boolean

var str = new String('hello'); //通过new创建的肯定都是对象
        alert(typeof str); // Object 对象
        // 既然是对象,下面有方法也就是正常的
        alert( str.charAt(1) ); // e
        // 源码当中是这样设计的
        String.prototype.charAt = function()      

基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装对象消失

// var str = 'hello';
        // str.charAt(0); // 基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装对象消失

        // 如果说要给一个字符串添加方法的话,我们应该如何操作呢
        var str = 'hello';
        // 比如我要写一个lastValue()方法,去找字符串后面最后一个字符
        // 写到包装对象的原型下面
        String.prototype.lastValue = function ()
          return this.charAt(this.length -1);
        };
        alert( str.lastValue() ); //弹出 o      
var str = 'hello';
str.number = 10; 
alert( str.number );       
str = 'hello';
       str.number = 10; //在基本类型的包装对象下面创建一个对象
       alert( str.number ); //undefine
       // 为什么会显示undefine呢?
       // 首先走var str = 'hello';的时候没有问题,str就是个基本类型
       // 走str.number = 10;的时候,这个基本类型要添加一个属性,
       // 它就会这个基本类型所对应的包装对象下面去创建一个对象,
       // 然后把这个10添加到对象下面,然后添加之后这个包装对象就消失了,
       // 消失之后当我们再去调用str.number的时候,这个时候str.number又重新创建了一个对象,
       // 这个对象和刚才添加的对象并不是同一个对象,因为包装对象消失了,他就会形成一个新的对象,
       // 这样的话,这个新的对象下面是没有的,所以是undefind      

继续阅读