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 相关文章推荐
子窗口、父窗口和Silverlight之间的相互调用
Aug 16 Javascript
javascript定时保存表单数据的代码
Mar 17 Javascript
javascript将浮点数转换成整数的三个方法
Jun 23 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
jQuery元素的隐藏与显示实例
Jan 20 Javascript
easyui-combobox 实现简单的自动补全功能示例
Nov 08 Javascript
jQuery中Chosen三级联动功能实例代码
Mar 07 Javascript
整理关于Bootstrap排版的慕课笔记
Mar 29 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
JavaScript闭包原理与用法实例分析
Aug 10 Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 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中实现进程间通讯
2006/10/09 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
文字幻灯片
2006/06/26 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
python字典的值可以修改吗
2020/06/29 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
什么叫做SQL注入,如何防止
2016/10/04 面试题
大学生毕业自我鉴定
2013/11/06 职场文书
小学后勤管理制度
2014/01/14 职场文书
个人校本研修方案
2014/05/26 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
终止劳动合同协议书
2014/10/05 职场文书
办公室管理规章制度
2015/08/04 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers