JS原型与原型链的深入理解


Posted in Javascript onFebruary 15, 2017

要了解原型和原型链,首先要理解普通对象和函数对象。

一、普通对象和函数对象的区别

在Javascript的世界里,全都是对象,而对象之间也是存在区别,我们首先区分一下普通对象和函数对象,如下代码:

function f1(){};
var f2 = function(){};
var f3 = new function(){};

var o1 = {};
var o2 = new Object();
var o3 = new f1();

console.log(typeof Object); //function
console.log(typeof Function);//function
console.log(typeof f1) //function
console.log(typeof f2) // function
console.log(typeof f3) //function
console.log(typeof o1) //object
console.log(typeof o2) //object
console.log(typeof o3)// object

在上面的代码中可以看出,f1、f2和f3都是函数对象,而o1,o2和o3都是object对象,也就是普通对象,函数对象本质就是由new function()构造而来,其他的都是普通对象;函数对象和普通对象理解之后,后文会说明两者的区别。

二、原型

在JavaScript中,原型也是一个对象,原型的作用,则是实现对象的继承。

在js的所有函数对象中,都存在一个属性prototype,该属性对应当前对象的原型。

而所有的JavaScript对象,都存在一个_proto_属性(由于_proto_是个非标准属性,因此只有ff和chrome两个浏览器支持,标准方法是Object.getPrototypeOf()),_proto_属性指向实例对象的构造函数的原型,理解起来就如下:

var p = new Person(); 
console.log(p._proto === Person.prototype)//true

从上面代码可以看出,p是实例对象,Person是p的构造函数,可以看出来p的_proto_属性指向构造函数Person的原型。

下面用代码来解释一下js是如何通过原型进行继承的:

var parent = function(name){
 this.name = name;
}
parent.prototype.getName = function(){
 return this.name;
}
var son = new parent("huahua");

console.log(son.getName());//'huahua'

显然,son继承了parent的原型中的函数属性getName。

三、原型链

除开Object的prototype的原型是null以外,所有的对象和原型都有自己的原型,对象的原型指向原型对象。

在层级多的关系中,多个原型层层相连则构成了原型链。

在查找一个对象的属性时,倘若在当前对象找不到该属性,则会沿着原型链一直往上查找,知道找到为止,如果到了原型链顶端,还没找到,则返回undefined。

JS原型与原型链的深入理解

四、constructor

constructor是构造函数创建的实例的属性,该属性的作用是指向创建当前对象的构造函数。

例如,son.constructor == parent;//true

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
Jul 14 Javascript
JQuery autocomplete 使用手册
Apr 01 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
JavaScript prototype 使用介绍
Aug 29 Javascript
JS批量修改PS中图层名称的方法
Jan 26 Javascript
jquery专业的导航菜单特效代码分享
Aug 29 Javascript
node.js 动态执行脚本
Jun 02 Javascript
jQuery轮播图实例详解
Aug 15 jQuery
Vue加载组件、动态加载组件的几种方式
Aug 31 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 Javascript
JS实现横向轮播图(初级版)
Jun 24 Javascript
JavaScript实现旋转木马轮播图
Mar 16 Javascript
js中数组插入、删除元素操作的方法
Feb 15 #Javascript
jQuery中on方法使用注意事项详解
Feb 15 #Javascript
防止重复发送 Ajax 请求
Feb 15 #Javascript
Input文本框随着输入内容多少自动延伸的实现
Feb 15 #Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
Feb 15 #Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
Feb 15 #Javascript
Canvas 绘制粒子动画背景
Feb 15 #Javascript
You might like
一个简单至极的PHP缓存类代码
2015/10/23 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
js 操作css实现代码
2009/06/11 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
Python两个字典键同值相加的几种方法
2019/03/05 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python logging添加filter教程
2019/12/24 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
关于晚自习早退的检讨书
2014/09/13 职场文书
基层党员对照检查材料
2014/09/24 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
赢在执行观后感
2015/06/16 职场文书
高中运动会广播稿
2015/08/19 职场文书
把77A收信机改造成收音机
2022/04/05 无线电