美文网首页JavaScript
[JavaScript] F.prototype=1

[JavaScript] F.prototype=1

作者: 何幻 | 来源:发表于2016-03-06 10:45 被阅读8次

    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

    相关文章

      网友评论

        本文标题:[JavaScript] F.prototype=1

        本文链接:https://www.haomeiwen.com/subject/rbdnkttx.html