美文网首页js 原理让前端飞
【JS】prototype、constructor、__prot

【JS】prototype、constructor、__prot

作者: 匿于烟火中 | 来源:发表于2020-02-21 17:37 被阅读0次

    相关名词概念

    名词 用途 描述 其他
    [[Construct]] 对象的一个内置方法,用于创建对象,通过new或者super关键字调用。 该内置方法的第一个参数是传入的参数列表。第二个参数是new所初始化的对象。最后返回一个Obejct。 constructor调用实现该内置方法
    constructor对象 用来创建和初始化一个对象。 是个具有prototype属性的function对象。(这个prototype属性保存的是一个指针,指向了prototype对象所在的位置)。 通过new创建对象的时候会调用constructor方法,不使用new调用constructor的话,根据具体实现可能会得到不同结果。比如:new Date()得到的是当前日期Date对象,Date()则是当前时间字符串
    constructor属性 指向constructor对象 保存的是引用
    prototype属性 指向一个prototype对象所在的位置 每个函数都有该属性,这个属性中保存的是引用,而不是具体的对象
    prototype对象 对象的用途是包含可以由特定类型的所有实例共享的属性和方法。 该对象的 __proto____属性指向了Object的原型
    ___proto____ 实例的属性,指向实例的原型对象 保存的也是对象的引用

    ecma262/#constructor

    function Parent(){
      this.name = 'parent';
    }
    var a = new Parent();
    console.log(Parent.prototype);
    console.log(Parent.constructor);
    console.log(Parent.prototype.constructor);
    console.log(a.prototype);
    console.log(a.__proto__);
    console.log(a.constructor);
    
    对象 取值
    Parent的prototype对象 一个具有constructor属性的Object(图:prototype 1-1 )
    Parent.prototype属性 Parent的prototype对象的引用
    Parent.constructor ƒ Function() { [native code] }
    Parent.prototype.constructor ƒ Parent(){this.name = 'parent';}
    a.prototype undefined
    a.__proto____ 与Parent.prototype相同
    a.constructor ƒ Parent(){this.name = 'parent';}
    prototype 1-1 prototypeimg.png

    new具体的过程


    1. 一个继承自 *Foo*.prototype 的新对象被创建。
    2. 使用指定的参数调用构造函数 Foo,并将 this 绑定到新创建的对象。new *Foo* 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
    3. 由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)
    new Parent() = {
        var obj = {};
        obj.__proto__ = Parent.prototype; // 此时便建立了obj对象的原型链:
        // obj->Parent.prototype->Object.prototype->null
        var result = Person.call(obj); // 相当于obj.Person("John")
        return typeof result === 'object' ? result : obj; // 如果无返回值或者返回一个非对象值,则将obj返回作为新对象
    }
    
    • 实现一个new方法
    function _new(fn,...arg){
        const obj = Object.create(fn.prototype);
        const ret = fn.apply(obj,arg);
        return ret instanceof Object?ret:obj;//考虑到基本数据类型
    }
    

    mozilla.org-new
    alexzhong22c js-new-happen

    Object.getPrototypeOf
    var o = new C();
    //o是C的实例,所以
    Object.getPrototypeOf(o) === C.prototype
    Object.getPrototypeOf 返回的是实例对象的原型
    因为Object是构造函数
    Object.getPrototypeOf(Object) 得到的是// f(){[native code]}
    Object.getPrototypeOf( Object ) === Function.prototype; // true
    因为把Object看作对象,Object是个函数
    所以Object.getPrototypeOf( Object )返回的就是函数对象的原型Function.prototype
    Object.prototype是构造出来的对象的原型。

    function prototype relationship
    Function prototype reference

    相关文章

      网友评论

        本文标题:【JS】prototype、constructor、__prot

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