理解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 相关文章推荐
Javascript下的keyCode键码值表
Apr 10 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
Jquery 绑定时间实现代码
May 03 Javascript
Javascript控制div属性动态变化实例分析
Oct 08 Javascript
js中获取时间new Date()的全面介绍
Jun 20 Javascript
js编写三级联动简单案例
Dec 21 Javascript
javaScript基础详解
Jan 19 Javascript
Vue组件中slot的用法
Jan 30 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 Javascript
微信小程序实现拍照画布指定区域生成图片
Jul 18 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
Sep 29 Javascript
Vue列表循环从指定下标开始的多种解决方案
Apr 08 Javascript
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
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
arguments对象
2006/11/20 Javascript
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
Django实现图片文字同时提交的方法
2015/05/26 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
itchat接口使用示例
2017/10/23 Python
python多维数组切片方法
2018/04/13 Python
python中实现字符串翻转的方法
2018/07/11 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
医大实习自我鉴定
2013/12/07 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
企业党员公开承诺书
2014/03/26 职场文书
寒山寺导游词
2015/02/03 职场文书
军训个人总结
2015/03/03 职场文书
2015年爱国卫生工作总结
2015/04/22 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python