五句话帮你轻松搞定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中把JSON字符串转换成JSON对象最好的方法
Mar 21 Javascript
Jquery对数组的操作技巧整理
Mar 25 Javascript
JavaScript运动减速效果实例分析
Aug 04 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
Jun 09 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
Jul 08 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
Oct 10 Javascript
Vue.js 60分钟快速入门教程
Mar 28 Javascript
Vue 进阶教程之v-model详解
May 06 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
打通前后端构建一个Vue+Express的开发环境
Jul 17 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
Jan 24 Javascript
Vue提供的三种调试方式你知道吗
Jan 18 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
js常见遍历操作小结
2019/06/06 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
python Django框架实现自定义表单提交
2016/03/25 Python
python实现图片文件批量重命名
2020/03/23 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python实现文件的分割与合并
2019/08/29 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
python实现超级马里奥
2020/03/18 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
交通事故检查书范文
2014/01/30 职场文书
公民授权委托书
2014/10/15 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
董存瑞观后感
2015/06/11 职场文书