理解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 客户端验证上传图片的大小(兼容IE和火狐)
Aug 15 Javascript
当鼠标移动时出现特效的JQuery代码
Nov 08 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
Oct 21 Javascript
jquery checkbox的相关操作总结
Oct 17 Javascript
jquery实现图片轮播器
May 23 jQuery
详解webpack+gulp实现自动构建部署
Jun 29 Javascript
Angular4实现图片上传预览路径不安全的问题解决
Dec 25 Javascript
Angular学习教程之RouterLink花式跳转
May 03 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
Jul 10 Javascript
javascript sort()对数组中的元素进行排序详解
Oct 13 Javascript
Node如何后台数据库使用增删改查功能
Nov 21 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编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
php实现微信扫码支付
2017/03/26 PHP
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
javascript模块化简单解析
2016/04/07 Javascript
jQuery的框架介绍
2016/05/11 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
js实现点赞效果
2020/03/16 Javascript
Python 查看文件的读写权限方法
2018/01/23 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
理货员的岗位职责
2013/11/23 职场文书
高校教师思想汇报
2014/01/11 职场文书
教育技术职业规划范文
2014/03/04 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
受资助学生感谢信
2015/01/21 职场文书
小学生安全保证书
2015/05/09 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python