原问题:
1
2
3
4
5
|
function
Users(){
}
Users.prototype=5;
var
u=
new
Users();
console.log(u.constructor);
|
输出的是Object();
可是u对象没有constructor属性,当访问u.constructor时找不到,就会向Users.prototype指向的对象(prototype对象中有个constructor属性)中查找,但是现在 sers.prototype=5;所以,理论上console.log(u.constructor);应该输出Number()类型的。这是怎么回事?教程上说constructor属性指向构造函数的,不知道内部怎么实现的,请分析下。
我的回复:
In the specification of ECMAScript Language Specification (Edition 3):
13.2.2 [[Construct]]
When the [[Construct]] property for a Function object F is called, the following steps are taken:
1. Create a new native ECMAScript object.
2. Set the [[Class]] property of Result(1) to "Object".
3. Get the value of the prototype property of the F.
4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).
5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object prototype object as described in section 15.2.3.1.
6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument list passed into [[Construct]] as the argument values.
7. If Type(Result(6)) is Object then return Result(6).
Step 5 gives the answer of your question.
因为 Users.prototype 是 5, 不是 Object, 所以 u 的内涵原型链[[Prototype]]是 Object, 不是 Users.prototype.
u.constructor --> u.[[Prototype]].constructor --> Object.constructor --> Object()
连接
原贴 http://bbs.csdn.net/topics/390379246