1

我正在阅读有关 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"

我期待它返回 "number" ,但它打印了 "object" 。这是预期的行为还是我在两者之间遗漏了什么?

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

4

3 回答 3

2

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

于 2013-04-03T06:59:01.537 回答
1

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

这种行为的解释可以在ES5 规范中找到:

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

让 O 成为ToObject(base)

顺便说一句,它不会在严格模式下发生:

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


valueOf()不返回原语的原因在这里

返回此数字值

根据该参考:

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

于 2013-04-03T06:47:43.343 回答
1

它可以分解为:

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

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

问题是为什么?

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

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

于 2013-04-03T07:01:45.643 回答