日期:2014-05-16  浏览次数:20502 次

JavaScript The Definitive Guide读书笔记 -- Wrapper Objects

JavaScript对象是属性的集合, 属性表现为常说的键值对, 当属性的值是function的时候,称为对象的方法。?

设对象o有方法m,调用此方法的方式为o.m()。

?

从以下代码可以看到, strings是有属性和方法的。

?

?

?

var s = "hello world";
var word = s.substring(s.indexOf(" ") + 1, s.length);

?

?

Strings不是对象类型, 为什么会拥有属性?

?

无论什么时候, 只要访问string的属性, JavsScript会使用new String(args)利用原始类型的string产生一个对象类型。

这个对象会继承string的方法, 用来访问对象的属性, 一旦属性访问结束, 刚刚创建的对象类型的string将被丢弃。

?

对Numbers和Booleans来说, 如果要访问他们的属性或者方法, 也使用了同样的机制。

?

同为原始类型的null与undefined并不适用此方法。 如果仍想访问他们的属性,你会得到一个TypeError。

?

?

var s = "test";
s.len = 4;
var t = s.len;
?

打印t得到的运行结果是undefined。 第二行的代码创建了临时String对象, 将4赋值给临时对象的属性len, 然后这个临时对象被丢弃。
第三行代码从原始的string s又创建了新的String对象, 然后将对象的len属性的值赋予t, 但是这个属性是不存在的, 所以结果得到了undefined。

从演示可以看出strings, numbers, boolean可以像对象一样让用户访问其属性或者方法。但是如果要对属性进行设置, 这样的行为就会被忽略。
因为变化发生在临时对象上,并不持久。

在访问string, number还有boolean的属性产生的临时对象称为wrapper objects, 很少有需要区分原始类型与他们的wrapper对象的时候。
通常情况下只需要知道他们和对象的区别, 还有他们的属性是只读的, 而且不能够定义新的属性。

wrapper对象是可以手动产生的。

var s = "test", n = 1, b = true;

var s_w = new String(s);
var n_w = new Number(n);
var b_w = new Boolean(b);

必要的时候JavaScript会将wrapper对象转换为原始类型, 所以以上的s_w, n_w, b_w "大部分" 情况下与s, n, b有同样的表现。
使用 == 比较原始类型与其wrapper对象会得到true。
使用 === 会得到false。
使用typeof也会得到不同的结果。