什么是原型,原型链?原型链是如何实现的?(带图清晰理解)
以下认识都属于个人观点:
首先先了解原型对象和原型的概念:
原型对象:
原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。所有的原型对象都是由Object构造函数创建出来的。
原型:
原型是一个对象,是函数的一个属性prototype;通过该函数实例化出来的对象都可以继承得到原型上的所有属性和方法。
构造函数:
通过new 函数名来实例化对象的函数叫构造函数。任何的函数都可以作为构造函数存在。
系统提供的构造函数:Function、Object等。
原型链:
每一个对象都从原型继承属性,直到null结束。
在JavaScript中万物都是对象,而对象和对象之间并不是独立存在的,对象和对象之间都有一定联系,而他们通过一种链式结构联系在一起,而这种链式结构就是原型链。
首先,一张通俗易懂的原型链图能够了解其中的结构:
注:所有的构造函数都是对象,故称为函数对象。
Function函数对象是自动生成的第一个对象
除了Function函数对象以外,所有的函数对象都是由Function函数对象创建的。
Function会自动创建出很多的函数对象出来,包括Object函数对象。而Object函数对象是Function自动创建的第一个函数对象。
所有的函数对象中都有一个叫做prototype的引用类型变量,而这个引用类型变量的值是对应原型对象的引用值,即该函数对象中的prototype指向它的原型对象。
同理,所有的原型对象中都有一个叫做constructor的引用类型变量,而这个引用类型变量的值是对应函数对象的引用值,即该原型对象中的prototype指向它的函数对象。
所有的对象中都有一个名为__proto__的引用类型变量,该引用类型便是对象的成员。关于__proto__的指向,分为以下几种情况:
1.所有的函数对象的__proto__都指向Function原型对象;
2.除Object原型对象外的所有原型对象中的__proto__都指向Object原型对象;
3.Object原型对象中的__proto__指向null;
4.所有实例对象中的__proto__都指向创建他的函数对象的原型对象。
对象访问成员的过程:
(1)当前对象中如果有该成员就获取该成员,访问结束。
(2)如果当前对象中没有该成员,就通过对应的__proto__指向的下一个对象中去寻找成员,如果找到了就结束,如果没有找到,就继续通过对应的__proto__指向的对象中去寻找,如果最终都没有找到的话,就返回null。
如上图中从实例对象中开始寻找:实例对象p1.__proto__ ==>原型对象Person.__proto__ ==>原型对象Object.__proto__ ==>null
如何分辨函数对象和原型对象:
一个对象中如果有prototype属性,那么该对象就一定是函数对象(构造函数),如果对象为函数对象,那么其中一定有prototype属性;
一个对象中如果有constructor属性,那么该对象就一定是原型对象,如果对象为原型对象,那么其中一定有constructor属性。
什么是原型,原型链?原型链是如何实现的?(带图清晰理解)相关推荐
- javascript原型对象、原型链、构造函数
1.原型对象(原型).原型链 先放一张在网上看到的关于原型和原型链的图,非常不错. 如果你能看懂,那就对原型链有了一定了解,如果看不懂,对照下面这几点来看图: js中所有函数都有一个prototype ...
- 原型和原型链原型继承_原型还是不原型:这就是问题所在。
原型和原型链原型继承 by Rishal Hurbans 由Rishal Hurbans 原型还是不原型:这就是问题所在. (To prototype or not to prototype: tha ...
- 【javascript】对原型对象、原型链的理解
原型对象,原型链这些知识属于基础类知识.但是平时开发过程中也很少用到. 看网上的意思,原型链用于es5开发场景下的继承.es6有了类语法糖之后,就自带继承了. 通过理解,个人画了一张原型链解构的关系图 ...
- 原型 / 构造函数 / 实例/原型链
原型 / 构造函数 / 实例/原型链 原型( prototype ): ⼀个简单的对象,⽤于实现对象的 属性继承.可以简单的理解成对象 的爹.在 Firefox 和 Chrome 中,每个 JavaS ...
- JavaScript 原型对象和原型链
开篇 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述.有一句话说的好:如果你不能把一个很复杂的东西用最简单的话语描述出来,那就 ...
- js原型和原型链_初识JS原型/原型链/原型继承
本文思路: 原型->原型链->原型继承->基于原型的继承/ES6中的继承->__proto__与prototype 首先我们知道JS中有对象,比如: var 但是在我们没有对这 ...
- java 原型图_一张图搞懂原型、原型对象、原型链
基本概念 在javascript中,函数可以有属性. 每个函数都有一个特殊的属性叫作原型(prototype) 每个对象拥有一个原型对象 [[Prototype]] / __proto__ / Obj ...
- JavaScript进阶-编程思想、构造函数的原型对象、对象原型、原型继承以及原型链
编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次 调用就可以了. 优点: 性能比面向对象高,适合跟硬件联系很紧密 的东西,例如单 ...
- 原型和原型链的理解(有图清晰明了)
记住一句话:万物皆对象 对于原型和原型链,我们要知道一下几个:函数对象,实例对象.原型对象 1)函数对象--就是平时称的对象: 2)实例对象--new出的对象或者{ }: 3)原型对象--所有的函数对 ...
最新文章
- Python 技术篇-requests发送post请求传文件给flask服务端报405、400问题解决方法
- Python:利用python编程实现三维图像绘制展示(六面体旋转、三维球柱状体、下雪场景等)
- mysql数据库雪崩_缓存与数据库一致性之三:缓存穿透、缓存雪崩、key重建方案...
- 这个高度站立办公十分的棒
- matlab 置顶曲线,matlab figure 最大,最小,置顶
- Vue.js 定义组件模板的七种方式
- EFCore-一对一配置外键小记
- js声明变量三种方式
- 排序算法第五篇——快速排序
- 前端性能监控方案window.performance 调研(转)
- [转]Hello, ASM——代码生成
- 主流强化学习算法论文综述:DQN、DDPG、TRPO、A3C、PPO、SAC、TD3
- 用c加加创建c语言项目,如何使用visual studio 2017创建C语言项目
- ***技巧总结(zz)
- Markdown 全文检索
- android检测ibeacon电量,Android检测IBeacon热点的方法
- 如何通过js关闭微信浏览器页面
- 控件、组件和插件的区别
- 春考天津计算机知识点资料,天津春季高考统一考试计算机基础科目考试大纲
- 基于C语言实现的多种可视化排序算法演示程序
热门文章
- dede织梦模板目录大全,绝对有帮助
- 基因序列分析(生物信息学论坛)
- 电商外包行业调查:千家企业争夺千亿蛋糕
- 计算机网络复习——第四章:网络层——数据平面
- Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/vm10-0-0-1
- 迅速用Github展开团队协作
- 数学专业学金融还是计算机,高考志愿---谈一谈数学专业
- html语言更改字体大小,在HTML中更改字体大小
- 2016年的年终总结
- 验证码的作用,为什么要存在验证码