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 相关文章推荐
Jquery节点遍历next与nextAll方法使用示例
Jul 22 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
Feb 16 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
Sep 20 Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
Jun 02 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
Sep 09 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
JS实现全屏的四种写法
Dec 30 Javascript
解决angularjs中同步执行http请求的方法
Aug 13 Javascript
脚手架vue-cli工程webpack的作用和特点
Sep 29 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
May 07 Javascript
JavaScript如何实现图片处理与合成
May 29 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
第十三节 对象串行化 [13]
2006/10/09 PHP
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
用Python写一个无界面的2048小游戏
2016/05/24 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
Python随机数函数代码实例解析
2020/02/09 Python
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
财务总经理岗位职责
2014/02/16 职场文书
人代会标语
2014/06/30 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
先进班集体事迹材料
2014/12/25 职场文书
停车场管理制度范本
2015/08/05 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
高中地理教学反思
2016/02/19 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
vue递归实现树形组件
2022/07/15 Vue.js