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 相关文章推荐
给网站上的广告“加速”显示的方法
Apr 08 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 Javascript
jquery URL参数判断,确定菜单样式
May 31 Javascript
js arguments对象应用介绍
Nov 28 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 jQuery
jQuery 循环遍历改变a标签的href(实例讲解)
Jul 12 jQuery
微信小程序日历效果
Dec 29 Javascript
JQuery特殊效果和链式调用操作示例
May 13 jQuery
Vue开发环境中修改端口号的实现方法
Aug 15 Javascript
vue 使用外部JS与调用原生API操作示例
Dec 02 Javascript
微信小程序实现电子签名功能
Jul 29 Javascript
js实现日历
Nov 07 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
如何更优雅地写python代码
2019/07/02 Python
python 三元运算符使用解析
2019/09/16 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
Python pandas如何向excel添加数据
2020/05/22 Python
python 爬取小说并下载的示例
2020/12/07 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
SQL Server面试题
2013/04/04 面试题
abstract是什么意思
2012/02/12 面试题
动画设计系毕业生求职信
2014/07/15 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
获奖感言范文
2015/07/31 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书