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 相关文章推荐
ExtJS 2.0实用简明教程 之获得ExtJS
Apr 29 Javascript
JavaScript 利用Cookie记录用户登录信息
Dec 08 Javascript
javascript 操作select下拉列表框的一点小经验
Mar 20 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
JS中判断null、undefined与NaN的方法
Mar 26 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
May 09 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
javascript设置文本框光标的方法实例小结
Nov 04 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
Nov 09 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
Dec 07 Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 Javascript
node简单实现一个更改头像功能的示例
Dec 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
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
input输入框的自动匹配(原生代码)
2013/03/19 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
javascript编写简易计算器
2017/05/06 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
python如何写try语句
2020/07/14 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
sort命令的作用和用法
2012/11/04 面试题
初一科学教学反思
2014/01/27 职场文书
2014年小学元旦活动方案
2014/02/12 职场文书
理发店策划方案
2014/06/05 职场文书
工作经验交流材料
2014/12/30 职场文书
开幕式邀请函
2015/01/31 职场文书
文员岗位职责范本
2015/04/16 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
教师节晚会主持词
2015/06/30 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书