理解JavaScript原型链


Posted in Javascript onOctober 25, 2016

每一个JavaScript对象都和另一个对象相关联,相关联的这个对象就是我们所说的“原型”。每一个对象都会从原型继承属性和方法。有一个特殊的对象没有原型,就是Object。在之后的图示中会进行说明。

举个栗子,我们首先声明一个函数Student():

function Student(name){
  this.name = name;
 this.hello = function(){
   alert(`Hello,${this.name}`);
 }
 }

这个函数包含一个属性name和一个方法hello。
在JavaScript中,可以通过new关键字来调用Student函数(不写new就是一个普通函数,写new就是一个构造函数),并且返回一个原型指向Student.prototype的对象,如下所示:

var xiaoming = new Student("xiaoming");
 alert(xiaoming.name); // xiaoming
 xiaoming.hello(); // Hello,xiaoming

如果我们想确认一下我们的设想对不对,就会希望去比较一下xiaoming.prototype和Student.prototype是否相等。
但是xiaoming没有prototype属性,不过可以用__proto__来查看。接下来我们就用这些属性来查看xiaoming,Student,Object之间的原型链:

document.onreadystatechange = function(){
 // interactive表示文档已被解析,但浏览器还在加载其中链接的资源
 if(document.readyState === "interactive"){
  var xiaoming = new Student("xiaoming");
  alert(xiaoming.name);
  xiaoming.hello();
  console.log("xiaoming.__proto__:");
  console.log(xiaoming.__proto__);
  console.log("Student.prototype:");
  console.log(Student.prototype);
  console.log("xiaoming.__proto__ === Student.prototype:" + xiaoming.__proto__ === Student.prototype);
  console.log("Student.prototype.constructor:" + Student.prototype.constructor);
  console.log("Student.prototype.prototype:" + Student.prototype.prototype);
  console.log("Student.prototype.__proto__:");
  console.log(Student.prototype.__proto__);
  console.log(Object.prototype);
  console.log("Student.prototype.__proto__ === Object.prototype:" + Student.prototype.__proto__ === Object.prototype);
 }
}

理解JavaScript原型链

七个红色箭头指向的就是七个console.log语句的输出结果。用图例展示一下如图所示:

理解JavaScript原型链

测试表明Object.prototype和Student.prototype.__proto__指向的Object并不是同一个。这个Object就是之前说的没有原型的那个Object,我们可以看到它并没有对应的prototype或者__proto__属性:

理解JavaScript原型链

由图可得原型链如下所示:

理解JavaScript原型链

由于本人语言表达能力有限,理解也比较浅显,所以图示比较多,错误之处还望指出,谢谢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 修改URL参数(实现代码)
Jul 08 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
Nov 12 Javascript
原生js和jquery中有关透明度设置的相关问题
Jan 08 Javascript
Lua表达式和控制结构学习笔记
Dec 15 Javascript
JS实现搜索框文字可删除功能
Dec 28 Javascript
一个炫酷的Bootstrap导航菜单
Dec 28 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
Feb 13 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
详谈vue中router-link和传统a链接的区别
Jul 22 Javascript
vant组件中 dialog的确认按钮的回调事件操作
Nov 04 Javascript
JavaScript实现优先级队列
Dec 06 Javascript
vue选项卡切换的实现案例
Apr 11 Vue.js
Ztree新增角色和编辑角色回显问题的解决
Oct 25 #Javascript
jQuery+json实现动态创建复杂表格table的方法
Oct 25 #Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
Oct 25 #Javascript
JavaScript prototype属性详解
Oct 25 #Javascript
对Angular.js Controller如何进行单元测试
Oct 25 #Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 #Javascript
input file上传 图片预览功能实例代码
Oct 25 #Javascript
You might like
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
MooTools 1.2介绍
2009/09/14 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python 同时读取多个文件的例子
2019/07/16 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python实现画出e指数函数的图像
2019/11/21 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
如何进行Linux分区优化
2016/09/13 面试题
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
小孩百日宴答谢词
2014/01/15 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android