理解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 相关文章推荐
基于JQuery的密码强度验证代码
Mar 01 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
Feb 12 Javascript
JavaScript立即执行函数的三种不同写法
Sep 05 Javascript
jQuery实现瀑布流的取巧做法分享
Jan 12 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
Dec 16 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
Jun 15 Javascript
jquery把int类型转换成字符串类型的方法
Oct 07 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
Oct 26 Javascript
将Sublime Text 3 添加到右键中的简单方法
Dec 12 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 jQuery
微信小程序vant弹窗组件的实现方式
Feb 21 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
PHP文件与目录操作示例
2016/12/24 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
python检测远程端口是否打开的方法
2015/03/14 Python
Python字符串格式化
2015/06/15 Python
python基础知识小结之集合
2015/11/25 Python
Python 调用Java实例详解
2017/06/02 Python
python用户管理系统的实例讲解
2017/12/23 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
Python实现点云投影到平面显示
2020/01/18 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
银行求职信个人范文
2013/12/16 职场文书
运动会广播稿50字
2014/01/26 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
歌唱比赛主持词
2014/03/18 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB