五句话帮你轻松搞定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 相关文章推荐
JS在IE和FF下attachEvent,addEventListener学习笔记
Nov 26 Javascript
return false;和e.preventDefault();的区别
Jul 11 Javascript
js调用图片隐藏&显示实现代码
Sep 13 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
Mar 02 Javascript
jQuery的end()方法使用详解
Jul 15 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
Jul 13 Javascript
JavaScript事件对象深入详解
Dec 30 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 Javascript
vue更改数组中的值实例代码详解
Feb 07 Javascript
从原生JavaScript到React深入理解
Jul 23 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
用PHP 4.2书写安全的脚本
2006/10/09 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php中fsockopen用法实例
2015/01/05 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
2019/04/10 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
Python实现多进程的四种方式
2019/02/22 Python
详解Python locals()的陷阱
2019/03/26 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
双创工作实施方案
2014/03/26 职场文书
学生自我评语
2015/01/04 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书