在javascript原型中使用valueOf函数

时间:2013-04-03 06:40:12

标签: javascript

我正在阅读有关javascript原型的内容,并且我通过以下代码扩展了Number类,以添加一个显示对象类型的函数

Number.prototype.toString = function() {
    return typeof (this);
}
(123).toString(); //prints "object"

我读到可以使用valueOf函数

获取原始表示
 n = new Number(123);
 typeof n.valueOf() // prints "number"

所以我试着在toString函数中得到preoteive表示,如

Number.prototype.toString = function() {
    return typeof (this.valueOf());
}
(123).toString(); //prints "object"

我期待它返回“数字”,但它打印出“对象”。这是一种预期的行为还是我错过了某些东西?

更新:Firebug和chrome控制台为我打印“对象”,并在两种情况下提醒显示号码 更新2:这是一个错误。 console.log((123).toString())打印号码

3 个答案:

答案 0 :(得分:2)

我无法打印除" number"以外的任何内容。即使您专门从数字创建Object,它也会变成一个数字。

(我将方法命名为getType以避免与现有的toString方法发生任何冲突。但我使用toString得到了相同的结果。)

Number.prototype.getType = function() {
    return typeof this.valueOf();
}
console.log((123).getType()); // prints "number"

var n = 123;
console.log(n.getType()); // prints "number"

var o = new Number(123);
console.log(o.getType()); // prints "number"

var x = new Object(123);
console.log(x.getType()); // prints "number"

我已经在IE(10,9,8,7),Firefox和Chrome中对此进行了测试,并得到了相同的结果。

测试:http://jsfiddle.net/Guffa/Xc7TC/

答案 1 :(得分:1)

原语上调用方法时,如42 JavaScript会自动将其转换为相应的对象。当您通过this.call()使用.apply()原语时,会发生同样的情况(至少在IE中)。

可以在ES5 spec

中找到有关此行为的说明
  

当V是具有基本基值的属性引用时,GetValue使用以下[[Get]]内部方法。使用base作为其值并使用属性P作为其参数调用它。采取以下步骤:

     

设O为ToObject(base)

顺便说一下,strict mode不会发生这种情况:

  

如果在严格模式代码中对此进行评估,则不会将此值强制转换为对象。


valueOf()未返回原语is here

的原因
  

返回this Number value

以下参考文献:

  

短语“this Number value”是指此Number对象表示的Number值,即此Number对象的<[PrimitiveValue]]内部属性的值,或者该值的类型是数字

答案 2 :(得分:1)

可以分解为:

// Case 1
typeof (Number(123));        // "number"

// Case 2
typeof (new Number(123));     // "object"

问题是为什么?

案例1:这是因为Number(123)实际上是一个函数调用,它将其参数值123转换为类型Number的值。

案例2: new Number(123)使用参数值创建Number 对象,这是直接调用Number 构造函数因为new;因此我们最后会得到object类型。