【发布时间】:2014-03-22 21:22:00
【问题描述】:
Stoyan Stefanov 在他的优秀著作《面向对象的 JavaScript》中说:
任何不属于上面列出的五种基本类型之一的值都是对象。
对于五种原始类型,他的意思是Number、String、Boolean、Undefined 和Null。然而,在 Google Chrome 控制台中,似乎 number 根本不是原始类型(与 C 类似 int 的原始类型相比)。看起来 primitive 数字有方法:
var a = 2.2;
console.log(a.toFixed()); // logs "2"
因此我假设我可以像使用对象一样使用数字,所以我尝试为它分配一个属性:
var a = 2;
a.foo = 'bar';
console.log(a.foo); // logs undefined
我不明白这种行为。如果 number 有一个方法,它应该表现得像一个对象,不是吗?它甚至还有一个原型:
Number.prototype.foo = 'bar';
var a = 2;
console.log(a.foo); // logs 'bar'
那么这背后的魔法是什么? JavaScript 如何处理对象与 primitive 类型?我宁愿不用primitive这个词,而是用simple objects代替它。在我看来,这些对象是不能用新属性扩展的,但是它们是通过它们的构造函数构造的,并且还有可以像普通对象一样扩展的原型。
【问题讨论】:
-
它只是未定义的,因为您没有在其上创建自己的自定义 'foo' 方法。当你这样做时(number.prototype.),没关系。这不是“魔术”只是阶级行为。 (适用于所有“类型”)所以我不确定如何回答你的问题“这背后的魔力是什么?” :L)
-
如果有什么不清楚的地方,只需发表评论或编辑问题,我会尝试相应地更新答案:)
标签: javascript