五句话帮你轻松搞定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 相关文章推荐
在JavaScript中使用开平方根的sqrt()方法
Jun 15 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
javascript单页面手势滑屏切换原理详解
Mar 21 Javascript
详解Jquery实现ready和bind事件
Apr 14 Javascript
JavaScript中的ajax功能的概念和示例详解
Oct 17 Javascript
10分钟掌握XML、JSON及其解析
Dec 06 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
深入理解 webpack 文件打包机制(小结)
Jan 08 Javascript
javascript实现视频弹幕效果(两个版本)
Nov 28 Javascript
js实现一款简单踩白块小游戏(曾经很火)
Dec 02 Javascript
Vue中key的作用示例代码详解
Jun 10 Javascript
js实现金山打字通小游戏
Jul 24 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
Codeigniter检测表单post数据的方法
2015/03/21 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
原生js实现放大镜
2017/02/20 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
实验教师岗位职责
2014/02/13 职场文书
关于环保的建议书
2014/05/12 职场文书
企业文化口号
2014/06/12 职场文书
医学专业自荐信
2014/06/14 职场文书
见习报告怎么写
2014/10/31 职场文书
涨价通知
2015/04/23 职场文书
宾馆卫生管理制度
2015/08/06 职场文书