我正在尝试遵循JavaScript的例子。
function A() {};
A.prototype.x = new Number(10);
var a = new A();
console.log(a.x);
在火狐中,它的打印值为10,但在Chrome或Node.js中,它的打印值为{}。
但当像下面这样更改第二行时,它也会在chrome中打印10
A.prototype.x = 10;
有人能给我解释一下为什么新的数字(10)在chrome中不起作用吗?
发布于 2013-03-17 01:14:09
这是因为你创建的是一个数字包装器对象,而不是一个原语,这就是Chrome选择的表示。(控制台表示并不总是相同的。没有标准。)
实际的number 10
存储在一个名为[[PrimitiveValue]]
的内部属性中,因此不会直接公开。
要获得它的[[PrimitiveValue]]
,可以使用.valueOf()
方法。
console.log(a.x.valueOf()); // 10
新构造的对象的[[Prototype]]
内部属性被设置为原始的Number原型对象,即Number.prototype
(15.7.3.1)的初始值。
新构造的对象的[[Class]]
内部属性设置为"Number"
。
如果提供了[[PrimitiveValue]]
,则将新构造对象的 +0
**.** 内部属性设置为,否则设置为 value
新构造的对象的[[Extensible]]
内部属性设置为true
.
发布于 2013-03-17 01:13:46
new Number(...)
创建一个装箱的Number实例,它与number原语不同。
Chrome的控制台将其显示为一个对象。
如果您编写console.log(new Number(10))
,您将看到相同的输出。
如果您将代码更改为使用原语(A.prototype.x = 10
),它将显示10
。
发布于 2013-03-17 01:13:47
因为Number是一个对象。console.log(a.x.valueOf());
或console.log(a.x.toString());
可以工作。
https://stackoverflow.com/questions/15456550
复制