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 相关文章推荐
jquery1.4后 jqDrag 拖动 不可用
Feb 06 Javascript
js绑定事件this指向发生改变的问题解决方法
Apr 23 Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
动态加载脚本提升javascript性能
Feb 24 Javascript
深入理解JS中的变量及作用域、undefined与null
Mar 04 Javascript
js使用for循环查询数组中是否存在某个值
Aug 12 Javascript
详解JavaScript基于面向对象之继承实例
Dec 16 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
May 28 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
react 中父组件与子组件双向绑定问题
May 20 Javascript
简单了解vue.js数组的常用操作
Jun 17 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+MySQL的聊天室设计
2006/10/09 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
Python中random模块生成随机数详解
2016/03/10 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
Python制作词云图代码实例
2019/09/09 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
python实现KNN近邻算法
2020/12/30 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
保险专业大学生职业规划书
2014/03/03 职场文书
餐饮业员工工作决心书
2014/03/11 职场文书
浪漫婚礼主持词
2014/03/14 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
人事任命通知书
2015/04/21 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
工作服管理制度范本
2015/08/06 职场文书
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python
python中数组和列表的简单实例
2022/03/25 Python