图文详解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 相关文章推荐
JavaScript 上万关键字瞬间匹配实现代码
Jul 07 Javascript
JavaScript实现的类字典插入或更新方法实例
Jul 10 Javascript
easyui Droppable组件实现放置特效
Aug 19 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
JS去掉字符串中所有的逗号
Oct 18 Javascript
jQuery+koa2实现简单的Ajax请求的示例
Mar 06 jQuery
js正则表达式校验指定字符串的方法
Jul 23 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
Dec 22 jQuery
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 Javascript
浅析js实现网页截图的两种方式
Nov 01 Javascript
仿照Element-ui实现一个简易的$message方法
Sep 14 Javascript
layui使用及简单的三级联动实现教程
Dec 01 Javascript
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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
php中转义mysql语句的实现代码
2011/06/24 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现无证书加密解密实例
2014/10/27 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
python中time包实例详解
2021/02/02 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
金士达面试非笔试
2012/03/14 面试题
P/Invoke是什么
2015/07/31 面试题
秋天的雨教学反思
2014/04/27 职场文书
本科生自荐信
2014/06/18 职场文书