关于JS包装对象的小问题

书上说包装对象可以显式声明,但是显式声明以后就不是“临时对象”吗?
这是直接给字符串加自定义属性:

var a1 = "test";
a1.len = 3;
var t = a1.len;
console.log(t);//undefined

包装对象可以显式声明,下面就是先显式声明以后,再添加自定义属性,为什么可以正常输出呢?,那不就不是“临时对象”了吗?就不是包装对象了吗?

var a2=new String("test");
a2.len = 3;
var t = a2.len;
console.log(t);//3

评论 (0)链接2017-03-01 

我不知道所谓的“临时对象”是什么意思。
你可以这么理解,在执行a1.len的时候,a1会被强制类型转换为Object。
但是a2本身就是一个对象,所以在执行a2.len的时候,就直接在a2这个对象还是那个添加了一个len属性。

那为什么 a1.len 是undefined的呢。这样你就懂了。
a1.len = 3 相当于 (new String(a1)).length = 3;
var t = a1.len; 相当于 var t = (new String(a1)).len;
两次都new了新的对象,所以你赋值的对象,取值的对象 就不是指向同一个引用。

有一个办法可以做到:
var a1 = "test";
a1.__proto__.len = 3;
a1.len = 5;
console.log(a1.len); // 3

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2017-05-16
德问是一个专业的编程问答社区,请 登录注册 后再提交答案