我们都知道js分为原始值和引用值、
原始值可以有属性吗?答案当然是没有,但是为什么原始值却可以调用一些方法呢。
var num = 123;
num.toString() ; // "123";
明明没有却可以调用toString的方法,就是因为包装类的原因,函数在执行的前一刻发现你写的代码其实是存在问题的,但是因为js是解释型语言,系统会为你进行包装类的操作。
new String(num) -- > "123";
会为你创建一个构想对象String,在看下一个例子。
var num = 123;
num.abc = "abc";
console.log(num.abc);
我们测试会发现,并不会报错会打印undefined,这是因为什么,num是原始值,根本不可能会有abc属性的,自己去添加怎么会不报错呢?而且不报错为什么还没有添加上呢?原因同样是因为包装类。
代码在执行到num.abc = "abc"时,系统发现了你的错误,会进行包装类
new Number(num).abc = "abc" ;
我们发现系统这样进行的包装类会为我们的num增加abc的属性方法,但是为什么又访问不到呢?
因为系统执行完这句语句,进行包装类之后就会delete销毁,当你执行到console.log(num.abc)时,系统一看num原始值,没有abc的属性啊,这么写这不是傻子吗,我帮帮傻子吧,又会帮你进行包装类的过程。
new Number(num).abc 去打印,但是我们需要注意的是,这次进行的包装类操作和上次的是一样的吗?‘
答案当然是否定的,系统执行语句进行包装类,执行完包装类之后就会销毁,在执行语句又会在创建包装类,那么你的这个新的包装类中并没有abc的属性,但是因为进行了包装类已经将num变成一个构造对象了,打印对象中的属性,即使我并没有这个属性,系统一样不会报错,只会提示我undefined。
以上就是包装类的过程,粗浅理解,万望包涵。