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。











网友评论