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 相关文章推荐
一页面多XMLHttpRequest对象
Jan 22 Javascript
JavaScript去掉空格的方法集合
Dec 28 Javascript
js验证模型自我实现的具体方法
Jun 21 Javascript
JavaScript中判断函数、变量是否存在
Jun 10 Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 Javascript
jQuery 判断图片是否加载完成方法汇总
Aug 10 Javascript
jQueryUI DatePicker 添加时分秒
Jun 04 Javascript
Bootstrap 实现查询的完美方法
Oct 26 Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 Javascript
Javascript网页抢红包外挂实现分享
Jan 11 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 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 JWT初识及其简单示例
2018/10/10 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
jQuery实现滑动开关效果
2020/08/02 jQuery
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
Django如何在不停机的情况下创建索引
2020/08/02 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
满月酒答谢词
2014/01/14 职场文书
法律六进活动方案
2014/03/13 职场文书
垃圾桶标语
2014/06/24 职场文书
关于感恩的演讲稿400字
2014/08/26 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL