js是區(qū)分引用類型和值類型的
值類型:數(shù)值童漩,布爾值,null春锋,undefined
引用類型:對象矫膨,數(shù)組,函數(shù)
(1)如果prototype是一個值類型的對象
var F=function(){};
F.prototype=1;
var a=new F;
則a
是一個空對象期奔,即new Object
或者說是{}
侧馅,
a.__proto__===Object.prototype
。
(2)構(gòu)造函數(shù)返回值類型的對象
var F=function(){
this.a=1;
return 2; //丟棄2能庆,相當(dāng)于return this
};
var a=new F;
(3)構(gòu)造函數(shù)返回引用類型的對象
var F=function(){
this.a=1;
return {b:2}; //丟棄this施禾,返回這個對象
};
var a=new F;
附
這里解釋下,第(1)節(jié)a.__proto__===Object.prototype
的原因搁胆。
我們知道弥搞,new F
會調(diào)用內(nèi)置的[[Construct]]函數(shù),來創(chuàng)建一個新的對象渠旁,F
中的this
就指向這個對象攀例,
5.a Let thisArgument be ? OrdinaryCreateFromConstructor (newTarget, "%ObjectPrototype%").
然后,又會調(diào)用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.
當(dāng)前場景F.prototype=1;
吗垮,proto
的類型不是Object垛吗,因此,
就將proto
設(shè)置為了realm
中名為intrinsicDefaultProto
值的內(nèi)置對象了烁登。
其中怯屉,intrinsicDefaultProto === "%ObjectPrototype%"
6.1.7.4 Well-Known Intrinsic Objects列舉了所有的內(nèi)置對象,
其中名為"%ObjectPrototype%"
的內(nèi)置對象就是Object.prototype
饵沧。