理解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 学习之二 属性(html()与html(val))
Nov 25 Javascript
一个网页标题title的闪动提示效果实现思路
Mar 22 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
Oct 14 Javascript
js判断移动端是否安装某款app的多种方法
Dec 18 Javascript
Javascript中级语法快速入手
Jul 30 Javascript
JavaScript事件用法浅析
Oct 31 Javascript
Node.js用readline模块实现输入输出
Dec 16 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
vue 标签属性数据绑定和拼接的实现方法
May 17 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
Jun 12 Javascript
Node.js 在本地生成日志文件的方法
Feb 07 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中的三元运算符使用说明
2011/07/03 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
3种php生成唯一id的方法
2015/11/23 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
关于Javascript作用域链的八点总结
2013/12/06 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python探索之自定义实现线程池
2017/10/27 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
俞敏洪北大演讲稿
2014/05/22 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
地道战观后感500字
2015/06/04 职场文书
食堂管理制度范本
2015/08/04 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL