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 相关文章推荐
javascript中验证大写字母、数字和中文
Jan 15 Javascript
让浏览器DOM元素最后加载的js方法
Jul 29 Javascript
Javascript基础教程之argument 详解
Jan 18 Javascript
javascript中字体浮动效果的简单实例演示
Nov 18 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
Jan 21 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
浅谈js函数的多种定义方法与区别
Nov 29 Javascript
原生js实现放大镜
Feb 20 Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
Jan 08 Javascript
mpvue开发音频类小程序踩坑和建议详解
Mar 12 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
附件名前加网站名
2008/03/23 PHP
PHP开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
js控制frameSet示例
2013/09/10 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
python通过smpt发送邮件的方法
2015/04/30 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
基于opencv实现简单画板功能
2020/08/02 Python
Django日志及中间件模块应用案例
2020/09/10 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
生产部主管岗位职责
2014/01/06 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
党员入党表决心的话
2014/03/11 职场文书
高中军训的心得体会
2014/09/01 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书