五句话帮你轻松搞定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 Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
Aug 28 Javascript
js动态添加删除,后台取数据(示例代码)
Nov 25 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
常用Javascript函数与原型功能收藏(必看篇)
Oct 09 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
Node.js数据库操作之查询MySQL数据库(二)
Mar 04 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
react 父子组件之间通讯props
Sep 08 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
Jul 19 Javascript
JS实现京东商品分类侧边栏
Dec 11 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
解决GD中文乱码问题
2007/02/14 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
使用js写的一个简易的投票
2013/11/27 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python中的__init__作用是什么
2020/06/09 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
高三自我鉴定
2013/10/23 职场文书
法制宣传口号
2014/06/16 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
大连导游词
2015/02/12 职场文书
年度考核登记表个人总结
2015/03/06 职场文书