2

我正在尝试遵循 JavaScript 示例。

function A() {};

A.prototype.x = new Number(10);

var a = new A();

console.log(a.x);

在 Firefox 中,其打印值为 10,但在 Chrome 或 Node.js 中,其打印值为 {}。

但是当像下面这样更改第二行时,它也会在 chrome 中打印 10

A.prototype.x = 10;

有人可以解释一下为什么 new Number(10) 不能在 chrome 中工作的原因。

4

3 回答 3

2

new Number(...)创建一个装箱的 Number 实例,它与数字原语不同。
Chrome 的控制台将其显示为一个对象。

如果你写console.log(new Number(10)),你会看到相同的输出。

如果您更改代码以使用原语 ( A.prototype.x = 10),它将显示10.

于 2013-03-17T01:13:45.523 回答
2

这是因为您正在制作一个 Number 包装器对象而不是一个原始对象,这是 Chrome 选择的表示形式。(控制台表示并不总是相同的。没有标准。)

实际数字10存储在名为 的内部属性中[[PrimitiveValue]],因此不会直接公开。

要获取它[[PrimitiveValue]],您可以使用该.valueOf()方法。

console.log(a.x.valueOf()); // 10

15.7.2.1 新数字([值])

新构造对象的[[Prototype]]内部属性设置为原始 Number 原型对象,即Number.prototype(15.7.3.1) 的初始值。

新构造对象的[[Class]]内部属性设置为"Number"

如果提供了值,则新构造对象的[[PrimitiveValue]]内部属性设置为ToNumber(value),否则设置为+0

新构造对象的[[Extensible]]内部属性设置为true

于 2013-03-17T01:14:08.667 回答
0

因为 Number 是一个对象。console.log(a.x.valueOf());console.log(a.x.toString());将工作。

于 2013-03-17T01:13:47.357 回答