图文详解JavaScript的原型对象及原型链


Posted in Javascript onAugust 02, 2016

对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__proto__混淆,二来它们之间的各种指向实在有些复杂,其实市面上已经有非常多的文章在尝试说清楚,有一张所谓很经典的图,上面画了各种线条,一会连接这个一会连接那个,说实话我自己看得就非常头晕,更谈不上完全理解了。所以我自己也想尝试一下,看看能不能把原型中的重要知识点拆分出来,用最简单的图表形式说清楚。

我们知道原型是一个对象,其他对象可以通过它实现属性继承。但是尼玛除了prototype,又有一个__proto__是用来干嘛的?长那么像,让人怎么区分呢?它们都指向谁,那么混乱怎么记啊?原型链又是什么鬼?相信不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,下面用三张简单的图,配合一些示例代码来理解一下。

一、prototype和__proto__的区别

图文详解JavaScript的原型对象及原型链

var a = {};
console.log(a.prototype); //undefined
console.log(a.__proto__); //Object {}

var b = function(){}
console.log(b.prototype); //b {}
console.log(b.__proto__); //function() {}

图文详解JavaScript的原型对象及原型链

/*1、字面量方式*/
var a = {};
console.log(a.__proto__); //Object {}

console.log(a.__proto__ === a.constructor.prototype); //true

/*2、构造器方式*/
var A = function(){};
var a = new A();
console.log(a.__proto__); //A {}

console.log(a.__proto__ === a.constructor.prototype); //true

/*3、Object.create()方式*/
var a1 = {a:1}
var a2 = Object.create(a1);
console.log(a2.__proto__); //Object {a: 1}

console.log(a.__proto__ === a.constructor.prototype); //false(此处即为图1中的例外情况)

图文详解JavaScript的原型对象及原型链

var A = function(){};
var a = new A();
console.log(a.__proto__); //A {}(即构造器function A 的原型对象)
console.log(a.__proto__.__proto__); //Object {}(即构造器function Object 的原型对象)
console.log(a.__proto__.__proto__.__proto__); //null

以上就是本文的全部内容了,本文用三张图解释了JavaScript的原型对象与原型链,希望对大家学习JavaScript的时候有所帮助。

Javascript 相关文章推荐
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
Aug 21 Javascript
jquery及原生js获取select下拉框选中的值示例
Oct 25 Javascript
replace()方法查找字符使用示例
Oct 28 Javascript
关于Javascript加载执行优化的研究报告
Dec 16 Javascript
详解如何在项目中使用jest测试react native组件
Feb 09 Javascript
vue 使用html2canvas将DOM转化为图片的方法
Sep 11 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
vue简单练习 桌面时钟的实现代码实例
Sep 19 Javascript
基于layui的下拉列表的数据回显方法
Sep 24 Javascript
vue 实现走马灯效果
Oct 28 Javascript
js canvas实现俄罗斯方块
Oct 11 Javascript
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
AngularJS基础 ng-mousemove 指令简单示例
Aug 02 #Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 #Javascript
js实现图片缓慢放大缩小效果
Aug 02 #Javascript
基于Vuejs实现购物车功能
Aug 02 #Javascript
js实现统计字符串中特定字符出现个数的方法
Aug 02 #Javascript
js简单时间比较的方法
Aug 02 #Javascript
JavaScript简单获取系统当前时间完整示例
Aug 02 #Javascript
You might like
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
python实现停车管理系统
2018/11/30 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
中专生自我鉴定范文
2014/02/02 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
趣味运动会口号
2015/12/24 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS