说到继承 ,先要弄明白 :构造函数、原型对象、实例之间的关系。

先来了解几个简单的概念:

构造函数:通过 关键字 new 来调用的 函数,var p = new Person();Person就称为构造函数。普通函数直接调用 Person() 。一个构造函数可以实例化多个对象,这些个对象并具有相同的原型对象

实例对象:通过new操作构造函数所创建的对象是实例对象,一个构造函数可以实例化多个对象,但各个实例对象并不相等

原型对象:原型对象的constructor属性 用于 返回 创建该对象的函数 ,也就是常说的构造函数。所以原型对象的constructor属性指向的是构造函数。

prototype 和 __proto__的区别

prototype:每个函数都有一个prototype属性,该属相指向的便是原型对象,值是一个对象。只有函数才有,实例对象没有 prototype

__proto__:实例对象,都有一个__proto__ 属性,该属性指向 创建该实例对象 的 构造函数的原型。

直接上图吧,看的更清楚

三者的关系,一看图就很清晰了吧:

1、函数对象 Student 的 prototype 指向原型对象,

2、原型对象的 constructor 指向函数对象 Student。

3、实例对象 new Student() 的  __proto__属性 指向原型对象( Student.prototype ),这个属性的作用是:允许 实例通过该属性 访问 原型对象中的属性和方法。

所有的实例都有一个内部指针指向他的原型对象,并且可以访问到原型对象上的所有属性和方法

原型链:

在js中万物皆对象,由于__proto__是任何对象都有的属性,所以会形成一条__proto__连起来的链条,一直向上找 __proto__直到最终到头,并且值是null。如上图中,最终找到 Object.prototype,并且值是null 了,就结束。

三者关系 我们来看几行代码:

console.log(s1.__proto__ === Student.prototype);//ture;
console.log('123'.__proto__ === String.prototype);//ture;
console.log([].__proto__ === Array.prototype);//ture;
console.log(s1.__proto__.__proto__ === Object.prototype);//true
console.log(Object.prototype.__proto__)//null  Object.prototype是原型链的终点//所有的实例都是通过Function创建出来的
console.log(Object.__proto__ === Function.prototype)//true
console.log(Function.__proto__ === Function.prototype)//true

查找对象的属性时,先查找对象本身是否存在该属性,如果不存在,会在原型链中查找,逐层向上查找,直到找到为止,

总结一下:

  1. 每个函数都有一个属性prototype,值是一个对象。只有函数才有,实例对象没有prototype属性。

  2. 所有的实例对象中,都有一个__proto__ 属性,该属性指向创建该实例对象的构造函数的原型

  3. 所有的原型对象都有constructor属性,该属性指向创建该实例的构造函数。

  4. 函数对象和原型对象通过prototype和constructor属性进行相互关联。

  5. 所有的函数都是Function的实例。

  6. Function也是自己的实例。

好啦 这一篇先到这里。我的文章都是学习过程中的总结,如果发现错误,欢迎留言指出,我及时更正

JavaScript 进阶 35 -- 构造函数、原型对象、实例之间的关系详解相关推荐

  1. JS——构造函数、原型与实例之间的关系 及 原型链 的描述

    本文转载自:https://www.cnblogs.com/sarahwang/p/6870072.html https://blog.csdn.net/u012443286/article/deta ...

  2. Windows server 2003域下全局组、本地域组及通用组之间的关系详解

    WINDOWS SERVER 2003 组的简介: 定义: 组(Group)是用户帐号的集合. 作用: 通过向一组用户分配权限从而不必向每个用户分配权限,简化管理.就是为用户和嵌套在里面的组等单元提供 ...

  3. 多维数组与指针之间的关系详解

    先介绍一下简单的一维数组: 列如: int a[3] = {0,1,2}; [3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小! 在内存中示意图是: 在CPU看来内存是 ...

  4. 二维数组和指针之间的关系详解

    一.引言 说起二维数组可能首先想到的是各种嵌套的for循环,二维数组的初始化,二维数组的赋值,二维数组的输出等各种问题,当然了,数组的问题永远离不开指针,而二维数组所能联系到的就是二维指针了,此文则是 ...

  5. MySQL总结(八)数据库表与表之间的关系-详解

    精选30+云产品,助力企业轻松上云!>>> 表与表之间的关系 1.表关系的概念 在现实生活中,实体与实体之间肯定是有关系的.比如:员工和部门,老师和学生等.那么我们在设计表的时候,就 ...

  6. java中dao和实体类的关系_【JAVA基础】 PO、VO、BO、DTO、POJO、DAO之间的关系详解...

    J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了 首先声明偶也不是什么高手,以 ...

  7. 浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系

    转自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html 浅谈javascript中原型(prototype). ...

  8. 构造函数,对象原型,实例对象三者之间的关系

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 1.构造函数,原型对象,实例对象三者之间的关系 每创建一个函数,该函数都会自动带有一个prototype属性.该 ...

  9. JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系

    02-面向对象编程 1.1-面向对象编程介绍 本小节知识点 1.理解什么是面向对象编程 面向对象不是一门技术,而是一种解决问题的思维方式 面向对象的本质是对面向过程的一种封装 2.理解什么是对象 对象 ...

最新文章

  1. ev3dev:设置自动登录wifi
  2. C语言-什么是尾递归
  3. Python的seaborn库(图比较炫)
  4. 【Cloud Foundry 应用开发大赛】“八卦街”图片采集应用
  5. python字符映射与文件加密
  6. IARPA启动“奥丁”项目,发展生物特征识别技术
  7. php 网状结构,数据库模型-数据结构-网状模型
  8. phpredis中文手册(使用方法)——《redis中文手册》 php版
  9. NFT - 2022年科技圈新宠
  10. 计算机组成原理ACC中文含义,计算机组成原理 作业一
  11. Hperledger Fabric入门课程3 ——软硬件环境
  12. 轻松让你了解朗锐慧康医疗仪器主板在监护仪的应用
  13. linux 配置JAVA 环境问题(一)/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
  14. keytool的用法
  15. 4.1 Go语言中包(Packages)基础知识
  16. note_2019_7
  17. 各种Getshell姿势总结
  18. 2015年蓝桥杯省赛C++B组真题与题解
  19. img的title和Alt有什么区别?
  20. Kali dpkg-source: warning: failed to verify signature on xxx

热门文章

  1. RoadRunner中自建地图并作为Carla Map笔记
  2. Eclipse Memory Analyzer,内存泄漏插件,安装使用
  3. android studio怎么改软件扫码界面_一文入门Android逆向
  4. Java网络爬虫基础概述
  5. 云服务器ECS网卡多队列优化
  6. java多线程 占用内存_java线程池常驻线程占内存吗
  7. 百兆以太网口通信速率_以太网发送速率(传输速率)和传播速率
  8. 分享html代码的博客,简单实用的HTML代码分享
  9. 动什么别动感情 第66节:你不是一个虚荣的女性
  10. 亚洲的音乐史料及其历史研究状况