js是区分引用类型和值类型的
值类型:数值,布尔值,null,undefined
引用类型:对象,数组,函数
(1)如果prototype是一个值类型的对象
var F=function(){};
F.prototype=1;
var a=new F;
则a
是一个空对象,即new Object
或者说是{}
,
a.__proto__===Object.prototype
。
(2)构造函数返回值类型的对象
var F=function(){
this.a=1;
return 2; //丢弃2,相当于return this
};
var a=new F;
(3)构造函数返回引用类型的对象
var F=function(){
this.a=1;
return {b:2}; //丢弃this,返回这个对象
};
var a=new F;
附
这里解释下,第(1)节a.__proto__===Object.prototype
的原因。
我们知道,new F
会调用内置的[[Construct]]函数,来创建一个新的对象,F
中的this
就指向这个对象,
5.a Let thisArgument be ? OrdinaryCreateFromConstructor (newTarget, "%ObjectPrototype%").
然后,又会调用GetPrototypeFromConstructor来获取proto
,作为新建对象的原型。
而GetPrototypeFromConstructor,会先从constructor
的prototype
中取到proto
,
- Let proto be ? Get (constructor, "prototype").
接着,再判断proto
的类型,
If Type(proto) is not Object, then
a. Let realm be ? GetFunctionRealm (constructor).
b. Set proto to realm's intrinsic object named intrinsicDefaultProto.
当前场景F.prototype=1;
,proto
的类型不是Object,因此,
就将proto
设置为了realm
中名为intrinsicDefaultProto
值的内置对象了。
其中,intrinsicDefaultProto === "%ObjectPrototype%"
6.1.7.4 Well-Known Intrinsic Objects列举了所有的内置对象,
其中名为"%ObjectPrototype%"
的内置对象就是Object.prototype
。