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 相关文章推荐
document.createElement()用法及注意事项(ff下不兼容)
Mar 13 Javascript
js 数组操作之pop,push,unshift,splice,shift
Jan 29 Javascript
JavaScript中对象property的读取和写入方法介绍
Dec 30 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
js实现模拟计算器退格键删除文字效果的方法
May 07 Javascript
JS访问SWF的函数用法实例
Jul 01 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
bootstrap table操作技巧分享
Feb 15 Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
JQuery 又谈ajax局部刷新
Nov 27 jQuery
element-ui循环显示radio控件信息的方法
Aug 24 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中GET变量的使用
2006/10/09 PHP
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
看了就知道什么是JSON
2007/12/09 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
JS中的phototype详解
2017/02/04 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
python 如何对logging日志封装
2020/12/02 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
汇科协同Java笔试题
2012/03/31 面试题
小小的船教学反思
2014/02/21 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
大学生求职自荐信
2015/03/24 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript