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 相关文章推荐
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
Sep 19 Javascript
javascript中的注释使用与注意事项小结
Sep 20 Javascript
javascript 获取函数形参个数
Jul 31 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
Jan 08 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
Vue.js在使用中的一些注意知识点
Apr 29 Javascript
JS实现带动画的回到顶部效果
Dec 28 Javascript
初学vue出现空格警告的原因及其解决方案
Oct 31 Javascript
Vue-cli项目部署到Nginx服务器的方法
Nov 01 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
May 25 Javascript
JavaScript Image对象实现原理实例解析
Aug 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
Angular路由ui-router配置详解
2018/08/01 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
python操作redis的方法
2015/07/07 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
社区巾帼文明岗事迹材料
2014/06/03 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
党员批评与自我批评
2014/10/15 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
python文件目录操作之os模块
2021/05/08 Python
SQLServer之常用函数总结详解
2021/08/30 SQL Server
Fluentd搭建日志收集服务
2022/09/23 Servers