[英]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中对此进行了测试,并得到了相同的结果。
在诸如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.