繁体   English   中英

在javascript原型中使用valueOf函数

[英]using valueOf function in javascript prototype

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

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

我读到可以使用valueOf函数获取原始表示

 n = new Number(123);
 typeof n.valueOf() // prints "number"

所以我试着在toString函数中得到premitive表示

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

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

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

我无法打印除“数字”以外的任何内容。 即使您专门从一个数字创建一个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/

在诸如42 JavaScript之类的基元上调用方法时,会自动将其转换为相应的对象。 同样的情况(至少在IE)当您使用原始作为this经由.call().apply()

可以在ES5规范中找到对此行为的解释:

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

设O为ToObject(base)

顺便说一句, 严格模式不会发生这种情况:

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


valueOf()不返回原语的原因在于

返回此Number值

以下参考:

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

它可以分解为:

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

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

问题是为什么?

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

情况2: new Number(123)使用参数值创建一个Number 对象 ,这是因为new而直接调用Number 构造函数 ; 因此我们最后获得了类型object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM