
js中的包装对象其实很简单

刘老板
2020年3月12日 10:12
很多同学初次看到这个名词的时候肯定一脸懵逼(其实我也是),之前也是直接跳过这个环节,之后看了许多的博客和书籍资料才搞懂的。但是在搞明白包装对象之我们 不可变的原始值 和 可变的对象。
基本类型 和 引用类型
因为在js中的原始值(undefined、null、Boolean,Number和String)和对象(数组和函数)有着根本的区别。首先原始值是不可能改变的(任何方法都不能)。很多同学说字符串不是有很多方法都可以改变的嘛,看上去是改变了,这些方法实际上已经给你返回来新的字符串了。下面我举一个小例子你们就一目了然了...

调用字符串方法的那一部分就是包装对象该做的事情。除了基本型就是引用类型(你也可以理解为是上面所说的对象),所以js数据类型大致分为大致分为基本型和引用型。
包装对象的执行过程
我们都知道js中的对象是一种复合值,有自己的方法和属性,可以通过"."符号来引用属性值和调用方法,但是我们会发现上面的例子中字符串也有同对象的属性和方法,上面我们也说过字符串是基本类型,并不属于引用型数据,但是为什么他能通过"."的形式调用方法能呢?
这就是今天我们说的包装对象了,其实这个过程就是String的包装对象在搞怪(这些装怪的类型还有Number和Boolean),暴露在我们眼前的好像并没有什么包装对象。其实这个过程是在后台悄悄执行的。也是我们来看个例子,更深入的理解...

通过上面的例子我们大致知道了包装对象的执行过程以及作用,我们同时也可以看出并没有改变字符串本身的值。同字符串一样,数字和布尔值也有各自的方法:也是通过Number()和Boolean()构造函数创建一个临时对象,这些的方法同时调用各自的临时对象。注意,null和undefined没有包装对象:访问他们的类型会造成一个类型的错误。
包装对象与引用类型的区别
那么问题又来了,基本包装类型和引用类型又有什么区别呢?当然不止名字上面的区别,他们生存时间是不同的,我们可以从上面的例子得知在包装对象的过程中创建的临时对象最终是要别消灭的,而引用类型在执行期间是一直存储在内存中的。
下面我们再看一个例子...

我们可以看出直接往字符串上设置并不能访问到,在之前的例子我们得知,包装对象创建的临时对象在执行完后会被删除的
var a = "test";
a.len = 4;
/*
var aStr = new String(a);
aStr.len = 4;
str = null;
*/
var t = s.len//这时候通过原始的字符串尝试访问临时对象的值当然是访问不到的所以说我们在修改原始值的时候要注意:修改只会发生在临时对象身上,而这个临时对象早就被删除了。如果我们想在基本类型上添加属性或方法怎么办呢?基本的包装对象都有一个原型(prototype)的属性,在这上面扩展就行了,具体的过程就在下次讲对象的时候在慢慢说。