使用构造函数初始化对象的过程
function Base(){} //函数声明
var base=new Base() //对象初始化
  • 执行Base()的过程:
    • 创建一个名为Base的function对象:
      • 执行function Base(){函数体}本质上相当于var Base=new Function("函数体");
      • 所以Base对象的构造函数的是Function();
    • 为Base对象添加属性:
      • 添加_proto_属性,其属性值Function.prototype,也就说Base对象的原型是其构造函数的prototype属性;
        • 在任意类似var x=new X()的过程中,都会设置x._proto_=X.prptotype;
      • 添加prototype属性:先用new Object()创建新对象,并为新对象创建constructor属性,属性值设置为Base;最后将该对象赋值给prototype属性;
        • 因为Base.prototype=new Object()所以Base.prototype._proto_==Object.prototype;
      • 为Base对象添加其他属性,如call,construct,scope,length等属性;
  • 执行var base=new Base()
    • 调用Base的construct属性引用的函数, 创建一个新object, 假设为x;
    • 将Base.prototype赋值给x._proto_属性;
      • 如果Base.prototype不是object,将Object.prototype赋值x._proto_;
    • 调用Base.call(x),对x进行初始化;
    • 返回x,x就是base;
    • 如果Base()使用return返回其他对象,base就是其他对象;
原型链
  • 因为base._proto_==Base.prototype,且Base.prototype._proto_==Object.prototype;
所以base._proto_._proto_==Object.prtotype; //原型链
    • 即base继承自Base.prototype,Base.prototype继承自Object.prototype;
  • 原型继承
    • 以上原型继承是通过将Base.prototype设置为由Obejct()创建的对象实现的;
    • 可以通过将任意的构造函数的prototype属性指定为一个对象,实现继承;
function Case(){};
Case.prototype=base;
var case=new Case();
  • case.的原型链是Case.prototype(base),Base.prototype,Object.prototype;
对象的constructor属性
  • 由自定义构造函数创建的对象默认没有自己的constructor属性的,只有由Object()创建的对象真正拥有constructor属性;
  • 所以base对象的constructor属性继承自Base.prototype,指向Base();
  • 同样case对象的constructor属性也继承自Base.prototype,指向Base();
红色
  • 对象f的原型是构造函数的prototype属性:F.prototype;
    • F.prototype的constructor属性指向f的构造函数F;
  • F.prototype作为对象其原型是Object.prototype;
青色
  • 构造函数F作为一个对象,其原型是Function.prototype;
    • Function.prototype的constructor属性指向F的构造函数Function;
蓝色
  • Function作为对象其原型是Function.prototype;
黄色
  • Function.prototype的原型是Object.prototype;
    • Object.prototype的constructor属性指向Function.prototype对象的构造函数Object;
紫色
  • Object作为一个函数,其原型是Function.prototype;
橙色
  • Object.prototype的原型是null

转载于:https://www.cnblogs.com/qinghe/p/5391558.html

深入理解构造函数和原型链相关推荐

  1. 原型 / 构造函数 / 实例/原型链

    原型 / 构造函数 / 实例/原型链 原型( prototype ): ⼀个简单的对象,⽤于实现对象的 属性继承.可以简单的理解成对象 的爹.在 Firefox 和 Chrome 中,每个 JavaS ...

  2. JS中对象的四种继承方式:class继承、原型链继承、构造函数继承、组合继承(构造函数和原型链继承的结合)

    前言 才发现之前没有对JavaScript中的继承做过总结,不过看得到是不少,接下来就对这几种继承方式做一下总结. class继承 class继承是ES6引入的标准的继承方式. ES6引入了class ...

  3. 原型、原型对象、构造函数、原型链理解

    1. 基本概念: "原型属性"也可以叫做"原型"(prototype):所有函数都有prototype,我觉得可以理解为python中的类属性,不需要通过实例, ...

  4. 新手理解的JS原型链

    一直以来对于JavaScript 的原型链的概念,始终有些东西有一种模糊感,最近刚好有时间就塌下心认真的把<JavaScript高级程序设计>中相关内容认真读了一遍,也查看了很多网上很多资 ...

  5. 新手理解的JS原型链 1

    一直以来对于JavaScript 的原型链的概念,始终有些东西有一种模糊感,最近刚好有时间就塌下心认真的把<JavaScript高级程序设计>中相关内容认真读了一遍,也查看了很多网上很多资 ...

  6. js深入理解构造函数和原型对象

    1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(prototy ...

  7. JS中关于构造函数、原型链、prototype、constructor、instanceof、__proto__属性

    在Javascript不存在类(Class)的概念,javascript中不是基于类的,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但是在ES6中引入 ...

  8. Javascript深入理解构造函数和原型对象

    1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propoty ...

  9. js构造函数的原型链

    年初前端面试,总会遇到面试官询问js的原型链问题,借用一张图片能帮助我们去复习这个问题: 1.每个构造函数都有一个prototype的原型对象,他的作用是为了共享构造方法,节省内存空间. 2.查找的机 ...

最新文章

  1. 静态链接中的那点事儿(2):C++二进制兼容性及跨平台初步
  2. lucene4.7 高亮功能(八)
  3. LeetCode之Merge Two Sorted Lists
  4. 产品经理必知必会的SQL
  5. 【NLP】EMNLP 2019 参会小结及最佳论文解读
  6. Map.Entry的使用(转载)
  7. Java程序设计基础——cmd编译运行java文件详细步骤
  8. 最全静态网页模板网站
  9. 思维模型 帕累托法则
  10. 小米、Vivo、Oppo后台弹出界面权限检测
  11. 双硬盘双win10互不干扰_win10系统安装双硬盘却无法显示另一个硬盘的技巧介绍...
  12. 一步精准获取京东商品评论数据
  13. 主流注意力机制介绍以及如何添加到YOLOV5
  14. ABP框架—后台:后台程序发布至IIS(6)
  15. 卷积神经网络常见模块
  16. calcite连接mysql_如何使用Calcite实现一个简单的数据库
  17. navicat使用和测试
  18. [译] 什么是即时通信(Instant Messaging)
  19. 最全的厚黑学…教你怎样混社会
  20. 关于NAS搭建的那些事

热门文章

  1. C++调用Python函数
  2. RTP/RTCP/RTSP协议初探
  3. 前端学习(3311):redux的state hook对象
  4. PS教程第四课:PS新建文档和像素
  5. 前端学习(2877):原生js模块化+绘制弹幕与动画video联动
  6. 前端学习(1920)vue之电商管理系统电商系统之角色列表路由的切换
  7. 前端学习(1802):前端调试之事件伪类
  8. oracle之高级子查询1
  9. 前端学习(1333):mongodb增
  10. 前端学习(1272):Vue前端路由