zoukankan      html  css  js  c++  java
  • prototype、proto与constructor详解

    在正式开始之前,我们先说一下对象的保存

     栈内存存放的是该对象的引用指针,真正的对象在堆内存中存着

    多个对象的保存

    function Foo() {...};
    let f1 = new Foo();

    创建一个构造函数Foo(),并使用new关键字实例化一个f1对象

    1.__proto__属性

     

    首先有两个要点:1.__proto__和constructor属性是对象独有的;2.prototype属性是函数所独有的。

    在js中,万事万物皆对象,所以函数也有__proto__和prototype属性

     __proto__属性,对象所独有,它是由一个对象指向一个对象即指向他们的原型对象。它的作用是当访问一个对象的属性时,如果该对象内部不存在该属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里面找,如果父对象也不存在该属性,就继续往父对象的__proto__属性所指的那个对象(爷爷对象)里找,若还没找到,则继续向上找,直到到达原型链顶端null(null为原型链的终点)。

    由以上这种通过__proto__属性来连接对象直到null的一条链即为原型链

    2.prototype属性

    prototype属性,函数所独有的,由一个函数指向对象,它的含义就是函数的原型对象,也就是这个函数所创建的实例的原型对象。f1.__proto__ ===   Foo.prototype 这两个完全一样。prototype属性作用就是包含可以由特定类型的所有实例共享的属性和方法。也就是让该函数所实例化的对象们都可以找到公用的属性和方法。任何函数在创建的时候,会默认同时创建该函数的prototype对象

     3.constructor属性

    constructor属性也是对象才拥有的,他是从一个对象指向一个函数含义就是指向该函数的构造函数每个对象都有构造函数(本身拥有或继承而来),从上图看来,Function这个对象有点特殊,它的构造函数就是它自己(因为Funtion可以看成是一个函数,也可以是一个对象),所有函数和对象都是由Function构造函数得来,所以constructor属性的终点就是Function这个函数

     4.总结

     1.牢记两点:1.__proto__和constructor属性是对象所独有的;2.prototype属性时函数所独有的,因为函数也是对象,所以函数也有__proto__和constructor属性

     2.__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在该属性,就沿着它的__proto__属性向上查找,在父对象里面查找,若父对象不存在,则继续向上查找,直到到达终点null,再向上找就相当于在null上取值,会报错。这就是所谓的原型链

    3.prototype属性的作用就是让该函数实例化的对象都可以访问到公共的属性和方法,即f1.__proto__ === prototype

    4.constructor属性含义是指向该对象的构造函数,最终的构造函数都指向Funtion

    文中内容参考一下几篇博文

    https://blog.csdn.net/cc18868876837/article/details/81211729

    https://www.cnblogs.com/xiaohuochai/p/5721552.html
    https://www.cnblogs.com/Narcotic/p/6899088.html

  • 相关阅读:
    DataTable:数据库到程序的桥梁
    《Javascript高级程序设计》阅读记录(三):第五章 上
    《Javascript高级程序设计》阅读记录(二):第四章
    javascript获取窗口位置、绝对位置、事件位置等
    《Javascript高级程序设计》阅读记录(一):第二、三章
    调试用随笔
    C#值类型和引用类型
    vue使用vue-awesome-swiper及一些问题
    npm与yarn命令对比
    npm与nrm
  • 原文地址:https://www.cnblogs.com/zoutuan/p/12030566.html
Copyright © 2011-2022 走看看