五句话帮你轻松搞定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 相关文章推荐
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
javascript封装的sqlite操作类实例
Jul 17 Javascript
JS实现可关闭的对联广告效果代码
Sep 14 Javascript
javascript实现用户点击数量统计
Dec 25 Javascript
整理关于Bootstrap警示框的慕课笔记
Mar 29 Javascript
关于vue.js v-bind 的一些理解和思考
Jun 06 Javascript
vue实现前进刷新后退不刷新效果
Jan 26 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
Nov 02 Javascript
koa2实现登录注册功能的示例代码
Dec 03 Javascript
微信小程序提交form操作示例
Dec 30 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 Javascript
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
Zend Guard一些常见问题解答
2008/09/11 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
react-native封装插件swiper的使用方法
2018/03/20 Javascript
React中的render何时执行过程
2018/04/13 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
python编码最佳实践之总结
2016/02/14 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
python Canny边缘检测算法的实现
2020/04/24 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
生物制药专业求职信
2014/03/11 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
会议营销主持词
2015/07/03 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
golang定时器
2022/04/14 Golang
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android