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 相关文章推荐
Array.prototype.slice 使用扩展
Jun 09 Javascript
ie9 提示'console' 未定义问题的解决方法
Mar 20 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
javascript事件模型介绍
May 31 Javascript
bootstrap table小案例
Oct 21 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
Feb 13 Javascript
js中删除数组中的某一元素实例(无下标时)
Feb 28 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
Mar 09 Javascript
SeaJS中use函数用法实例分析
Oct 10 Javascript
vue+element-ui+axios实现图片上传
Aug 20 Javascript
vue 实现单选框设置默认选中值
Nov 07 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 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
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
jQuery 获取URL参数的插件
2010/03/04 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
python 文件和路径操作函数小结
2009/11/23 Python
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
Python实现简单拆分PDF文件的方法
2015/07/30 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
Python如何输出整数
2020/06/07 Python
Python魔术方法专题
2020/06/19 Python
大码女装:Ulla Popken
2019/08/06 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
某公司Java工程师面试题笔试题
2016/03/27 面试题
应用心理学个人的求职信
2013/12/08 职场文书
预备党员表决心书
2014/03/11 职场文书
小学英语课后反思
2014/04/26 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
土建技术员岗位职责
2015/04/11 职场文书
2016公司年会主持词
2015/07/01 职场文书
大学同学聚会感言
2015/07/30 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书