三种包装对象还可以在原型上添加自定义方法和属性,供原始类型的值直接调用。
例如,新增一个double方法,使得字符串和数字翻倍。
String.prototype.double = function () { return this.valueOf() + this.valueOf(); }; 'abc'.double(); // abcabc Number.prototype.double = function () { return this.valueOf() + this.valueOf(); }; (123).double(); // 246
上面代码在123外面必须要加上圆括号,否则后面的点运算符(.)会被解释成小数点。
但是,这种自定义方法和属性的机制,只能定义在包装对象的原型上,如果直接对原始类型的变量添加属性,则无效。例如:
var s = 'abc'; s.p = 123; s.p // undefined
上面代码直接对字符串abc添加属性,结果无效。主要原因可参考上面说明,这里的包装对象是自动生成的,赋值后自动销毁,所以最后一行实际上调用的是一个新的包装对象。