[JavaScript] F.prototype=1

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,会先从constructorprototype中取到proto

  1. 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

参考

ECMAScript Language Specification

点赞