理解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 检测浏览器和操作系统的脚本
Dec 26 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
Jul 03 Javascript
js模拟点击事件实现代码
Nov 06 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
Jun 07 Javascript
javascript 实现 原路返回
Jan 21 Javascript
Node.js操作mysql数据库增删改查
Mar 30 Javascript
解析javascript图片懒加载与预加载的分析总结
Oct 27 Javascript
浅谈Node.js:Buffer模块
Dec 05 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
深入掌握 react的 setState的工作机制
Sep 27 Javascript
微信小程序实现图片翻转效果的实例代码
Sep 20 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 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实现jQuery扩展函数
2009/10/30 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php实现分页显示
2015/11/03 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
python实现udp数据报传输的方法
2014/09/26 Python
python正则表达式中的括号匹配问题
2014/12/14 Python
python使用append合并两个数组的方法
2015/04/28 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
python3下载抖音视频的完整代码
2019/06/05 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
小学生自我评价范例
2013/09/24 职场文书
最受欢迎的自我评价
2013/12/22 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
家长通知书家长评语
2014/04/17 职场文书
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS