理解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过滤选择器:not()方法使用介绍
Apr 20 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
Nov 13 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
JS实现点击按钮后框架内载入不同网页的方法
May 05 Javascript
layui分页效果实现代码
May 19 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
Sep 15 Javascript
vue中各种通信传值方式总结
Feb 14 Javascript
layer页面跳转,获取html子节点元素的值方法
Sep 27 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
JavaScript文档对象模型DOM
Nov 20 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 和 MySQL 基础教程(四)
2006/10/09 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
php中opendir函数用法实例
2014/11/15 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
javascript新手语法小结
2008/06/15 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
ReactNative列表ListView的用法
2017/08/02 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
python调用windows api锁定计算机示例
2014/04/17 Python
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
Python socket 套接字实现通信详解
2019/08/27 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
详解HTML5中的manifest缓存使用
2015/09/09 HTML / CSS
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
写给女朋友的道歉信
2014/01/08 职场文书
合作经营协议书范本
2014/09/16 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
2015年林业工作总结
2015/05/14 职场文书
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP