Constructor.prototype不在原型链中?

Ash*_*ary 7 javascript prototype

相关:关于原型链,基元和对象的混淆

在Firebug控制台中:

a = 12
a.constructor.prototype.isPrototypeOf(a) // prints 'false'
Run Code Online (Sandbox Code Playgroud)

我认为这应该打印 true

zzz*_*Bov 9

a = 12创建一个原始数字,它与一个Number对象不完全相同.为了属性访问的目的,基元被隐式地转换为对象.

a = 12; //a is a primitive
b = new Number(12); //b is an object
a.constructor.prototype.isPrototypeOf(a); //false because a is primitive
b.constructor.prototype.isPrototypeOf(b); //true because b is an object
Run Code Online (Sandbox Code Playgroud)

根据ECMAScript规范:

isPrototypeOf方法被调用以参数V,采取下面的步骤:

  1. 如果V不是对象,则返回false.

严格来说,原始数字不是对象.

  • 好答案.这由"Object.getPrototypeOf(12)"进一步说明,它抛出`非对象`上调用的TypeError:Object.getPrototypeOf.而`Object.getPrototypeOf(new Number(12))`返回`Number {}`. (2认同)

Hal*_*yon 0

a = new Number(12);
a.constructor.prototype.isPrototypeOf(a) // prints 'true'
Run Code Online (Sandbox Code Playgroud)

我不够聪明,无法告诉你为什么我只知道事情就是这样。是的,这很奇怪。

现在,你可以说12是一个基元,new Number(12)也是一个对象”。但你如何解释这一点呢?

(12).toFixed(3); // "12.000"
Run Code Online (Sandbox Code Playgroud)

显然,JavaScript 在某个地方决定原语也可能是一个对象。

为什么存在这种区别?两种形式之间如何转换?这对性能有何影响?所有与这个问题相关的问题我都没有答案。

  • @FritsvanCampen,原语在 [ECMAScript 规范](http://es5.github.com/#x11.4.3) 中定义为不是对象,但为了访问属性和方法,它们被临时转换为它们的对象各自的对象类型。 (2认同)