JavaScript 进阶 35 -- 构造函数、原型对象、实例之间的关系详解
说到继承 ,先要弄明白 :构造函数、原型对象、实例之间的关系。
先来了解几个简单的概念:
构造函数:通过 关键字 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
查找对象的属性时,先查找对象本身是否存在该属性,如果不存在,会在原型链中查找,逐层向上查找,直到找到为止,
总结一下:
每个函数都有一个属性prototype,值是一个对象。只有函数才有,实例对象没有prototype属性。
所有的实例对象中,都有一个__proto__ 属性,该属性指向创建该实例对象的构造函数的原型
所有的原型对象都有constructor属性,该属性指向创建该实例的构造函数。
函数对象和原型对象通过prototype和constructor属性进行相互关联。
所有的函数都是Function的实例。
Function也是自己的实例。
好啦 这一篇先到这里。我的文章都是学习过程中的总结,如果发现错误,欢迎留言指出,我及时更正
JavaScript 进阶 35 -- 构造函数、原型对象、实例之间的关系详解相关推荐
- JS——构造函数、原型与实例之间的关系 及 原型链 的描述
本文转载自:https://www.cnblogs.com/sarahwang/p/6870072.html https://blog.csdn.net/u012443286/article/deta ...
- Windows server 2003域下全局组、本地域组及通用组之间的关系详解
WINDOWS SERVER 2003 组的简介: 定义: 组(Group)是用户帐号的集合. 作用: 通过向一组用户分配权限从而不必向每个用户分配权限,简化管理.就是为用户和嵌套在里面的组等单元提供 ...
- 多维数组与指针之间的关系详解
先介绍一下简单的一维数组: 列如: int a[3] = {0,1,2}; [3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小! 在内存中示意图是: 在CPU看来内存是 ...
- 二维数组和指针之间的关系详解
一.引言 说起二维数组可能首先想到的是各种嵌套的for循环,二维数组的初始化,二维数组的赋值,二维数组的输出等各种问题,当然了,数组的问题永远离不开指针,而二维数组所能联系到的就是二维指针了,此文则是 ...
- MySQL总结(八)数据库表与表之间的关系-详解
精选30+云产品,助力企业轻松上云!>>> 表与表之间的关系 1.表关系的概念 在现实生活中,实体与实体之间肯定是有关系的.比如:员工和部门,老师和学生等.那么我们在设计表的时候,就 ...
- java中dao和实体类的关系_【JAVA基础】 PO、VO、BO、DTO、POJO、DAO之间的关系详解...
J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了 首先声明偶也不是什么高手,以 ...
- 浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系
转自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html 浅谈javascript中原型(prototype). ...
- 构造函数,对象原型,实例对象三者之间的关系
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 1.构造函数,原型对象,实例对象三者之间的关系 每创建一个函数,该函数都会自动带有一个prototype属性.该 ...
- JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系
02-面向对象编程 1.1-面向对象编程介绍 本小节知识点 1.理解什么是面向对象编程 面向对象不是一门技术,而是一种解决问题的思维方式 面向对象的本质是对面向过程的一种封装 2.理解什么是对象 对象 ...
最新文章
- ev3dev:设置自动登录wifi
- C语言-什么是尾递归
- Python的seaborn库(图比较炫)
- 【Cloud Foundry 应用开发大赛】“八卦街”图片采集应用
- python字符映射与文件加密
- IARPA启动“奥丁”项目,发展生物特征识别技术
- php 网状结构,数据库模型-数据结构-网状模型
- phpredis中文手册(使用方法)——《redis中文手册》 php版
- NFT - 2022年科技圈新宠
- 计算机组成原理ACC中文含义,计算机组成原理 作业一
- Hperledger Fabric入门课程3 ——软硬件环境
- 轻松让你了解朗锐慧康医疗仪器主板在监护仪的应用
- linux 配置JAVA 环境问题(一)/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
- keytool的用法
- 4.1 Go语言中包(Packages)基础知识
- note_2019_7
- 各种Getshell姿势总结
- 2015年蓝桥杯省赛C++B组真题与题解
- img的title和Alt有什么区别?
- Kali dpkg-source: warning: failed to verify signature on xxx