在javascript原型中使用valueOf函数

在javascript原型中使用valueOf函数,javascript,Javascript,我正在阅读有关javascript原型的内容,并阅读了以下代码,这些代码扩展了Number类,添加了一个显示对象类型的函数 Number.prototype.toString = function() { return typeof (this); } (123).toString(); //prints "object" 我读到,可以使用valueOf函数获得原语表示 n = new Number(123); typeof n.valueOf() // prints "numbe

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

Number.prototype.toString = function() {
    return typeof (this);
}
(123).toString(); //prints "object"
我读到,可以使用
valueOf
函数获得原语表示

 n = new Number(123);
 typeof n.valueOf() // prints "number"
所以我试着得到toString函数中的前置表示,比如

Number.prototype.toString = function() {
    return typeof (this.valueOf());
}
(123).toString(); //prints "object"
我原以为它会返回“number”,但它打印了“object”。这是一种预期的行为还是我在两者之间遗漏了什么

更新:Firebug和chrome控制台为我打印“对象”,警报显示两种情况下的编号
更新2:这是一个错误。console.log((123).toString())打印的数字

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

有关此行为的解释,请参见:

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

设O为
对象(基)

顺便说一句,它不会发生在:

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


valueOf()
不返回原语的原因:

返回

根据该参考:

短语“this Number value”指由该Number对象表示的数值,即该Number对象的[[PrimitiveValue]]内部属性的值,或者如果其类型为Number,则指this值


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

有关此行为的解释,请参见:

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

设O为
对象(基)

顺便说一句,它不会发生在:

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


valueOf()
不返回原语的原因:

返回

根据该参考:

短语“this Number value”指由该Number对象表示的数值,即该Number对象的[[PrimitiveValue]]内部属性的值,或者如果其类型为Number,则指this值


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

(我将方法命名为
getType
,以避免与已有的
toString
方法发生冲突。不过,我使用
toString
得到了相同的结果。)

我已经在IE(10,9,8,7),Firefox和Chrome上测试过了,得到了同样的结果


测试:

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

(我将方法命名为
getType
,以避免与已有的
toString
方法发生冲突。不过,我使用
toString
得到了相同的结果。)

我已经在IE(10,9,8,7),Firefox和Chrome上测试过了,得到了同样的结果


测试:

它可以分解为:

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

// Case 2
typeof (new Number(123));     // "object"
问题是为什么

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


案例2:
newnumber(123)
使用参数值创建一个
Number
对象,由于
new
,这是直接调用
Number
构造函数;因此,我们在末尾得到类型
对象

可以分解为:

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

// Case 2
typeof (new Number(123));     // "object"
问题是为什么

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


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

我无法重现这一点-我运行的代码与您上一个代码块(在Chrome javascript控制台)中的代码完全相同,并且得到了“number”…在IE9开发者工具javascript控制台中得到的结果相同(即,我得到的是“number”而不是“object”)。您使用什么浏览器获取“对象”?感谢您指出这一点。Firebug和chrome控制台为我打印“object”,alert在这两种情况下都显示数字
typeof
是一个运算符,而不是一个函数,因此它后面的括号可能会丢失。请注意,这一观察结果与您的问题不太相关:我无法重现这一点-我正在运行您在上一个代码块(在Chrome javascript控制台中)中的代码,并且得到了“number”…在IE9 developer tools javascript控制台中得到了相同的结果(即,我得到的是“number”而不是“object”)。您使用什么浏览器获取“对象”?感谢您指出这一点。Firebug和chrome控制台为我打印“object”,alert在这两种情况下都显示数字
typeof
是一个运算符,而不是一个函数,因此它后面的括号可能会丢失。请注意,这一观察结果与您的