五句话帮你轻松搞定js原型链


Posted in Javascript onDecember 09, 2020

原型链是一种机制,指的是JavaScript每个对象包括原型对象都有一个内置的[[proto]]属性指向创建它的函数对象的原型对象,即prototype属性。 作用:原型链的存在,主要是为了实现对象的继承。

一、 记住以下5句话,轻松搞定js原型链

  • Function 和 Object 都是构造函数
  • 所有的构造函数都是Function new出来的(Function自己new了自己);所有的原型对象都是Object new出来的(Object new了自己的原型对象)
  • 每一个构造函数都有一个prototype属性指向其原型对象;每一个实例对象都有一个_ _ proto _ _ 属性;实例对象的_ _ proto _ _ 等于其构造函数的prototype
  • 每一个原型对象都有一个天生属性constructor,指向其对应的构造函数
  • 底层规定Object.prototype._ _ proto _ _ 等于null

二、下边我们结合一小段代码来详细说明原型链的画图过程

function Game(brand,name,price) {
  this.price= price;
  this.brand = brand;
  this.name = name;
 }
 var g1 = new Game('EA','彩虹六号','200rmb');

1.根据上边的代码我们先定义了一个构造函数叫做Game,假设Game在堆内存中的地址为0x100;并通过它new出了一个实例对象g1,g1在堆内存中的地址为0x200。构造函数Game有天生属性prototype,并指向其原型对象(在堆内存中的地址为0x300)),实例对象g1具有天生属性_ _ proto _ _ ,并指向其构造函数的原型对象;原型对象具有天生属性constructor指向其对应的构造函数。然后我们得到如下图:

五句话帮你轻松搞定js原型链

2.由于所有的原型对象都是Object(0x400) new 出来的,所以0x300这个原型对象同时也是Object的一个实例对象,既然是实例对象就具有天生属性_ _ proto _ _ ,并指向其构造函数的原型对象(0x500);因为Object自身也是一个构造函数,所以其也有天生属性prototype,并指向其原型对象(0x500);又因为所有的原型对象都是Object(0x400) new 出来的,所以0x500这个原型对象也是Object new出来的,因为0x500是Object的原型对象,所以0x500的天生属性constructor指向Object;由于底层规定Object.prototype._ _ proto _ _ 等于null,然后我们得到如下图:

五句话帮你轻松搞定js原型链3.

我们再来看构造函数,由于所有的构造函数都是Function new出来的,所以Function(0x600) new出了自己、Object、Game这三个构造函数,那么这三个构造函数都是Function的实例对象,它们的_ _ proto _ _ 都指向Function的prototype(0x700),0x700的天生属性constructor又指向0x600;由于0x700是Object new 出来的,所以0x700的_ _ proto _ _ 指向Object 的原型对象0x500,最终我们得到如下终极原型链图:

五句话帮你轻松搞定js原型链

到此这篇关于js原型链的文章就介绍到这了,更多相关js原型链内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
javascript 触发事件列表 比较不错
Sep 03 Javascript
JavaScript DOM 学习第九章 选取范围的介绍
Feb 19 Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
详解vue过滤器在v2.0版本用法
Jun 01 Javascript
详解Vue 方法与事件处理器
Jun 20 Javascript
vue中实现在外部调用methods的方法(推荐)
Feb 08 Javascript
一文读懂ES7中的javascript修饰器
May 06 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
8个非常实用的Vue自定义指令
Dec 15 Vue.js
JS常用跨域方法实现原理解析
Dec 09 #Javascript
video.js添加自定义组件的方法
Dec 09 #Javascript
手把手教你如何编译打包video.js
Dec 09 #Javascript
ES6 十大特性简介
Dec 09 #Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 #Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
Dec 09 #Javascript
使用typescript快速开发一个cli的实现示例
Dec 09 #Javascript
You might like
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
python多进程实现进程间通信实例
2017/11/24 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python实现zabbix发送短信脚本
2018/09/17 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
房地产销售员的自我评价分享
2013/12/04 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS