JS原型、原型链深入理解


Posted in Javascript onFebruary 27, 2016

原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。

一、初识原型
在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个”[[Prototype]]”内部属性,这个属性所对应的就是该对象的原型。
“[[Prototype]]”作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,Firefox和Chrome中提供了__proto__这个非标准(不是所有浏览器都支持)的访问器(ECMA引入了标准对象原型访问器”Object.getPrototype(object)”)。在JavaScript的原型对象中,还包含一个”constructor”属性,这个属性对应创建所有指向该原型的实例的构造函数

二、规则
在JavaScript中,每个函数 都有一个prototype属性,当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给所有对象实例(也就是设置 实例的`__proto__`属性),也就是说,所有实例的原型引用的是函数的prototype属性。(****`只有函数对象才会有这个属性!`****)

new 的过程分为三步 

var p = new Person('张三',20);

1. var p={}; 初始化一个对象p。
2. p._proto_=Person.prototype;,将对象p的 __proto__ 属性设置为 Person.prototype
3. Person.call(p,”张三”,20);调用构造函数Person来初始化p。关于call/apply使用

三、初识Object
Object对象本身是一个函数对象。(CODE TEST) 既然是Object函数,就肯定会有prototype属性,所以可以看到”Object.prototype”的值就是”Object {}”这个原型对象。反过来,当访问”Object.prototype”对象的”constructor”这个属性的时候,就得到了Obejct函数。
另外,当通过”Object.prototype._proto_”获取Object原型的原型的时候,将会得到”null”,也就是说”Object {}”原型对象就是原型链的终点了。
四、初识Function
如上面例子中的构造函数,JavaScript中函数也是对象,所以就可以通过_proto_查找到构造函数对象的原型。
Function对象作为一个函数,就会有prototype属性,该属性将对应”function () {}”对象。
Function对象作为一个对象,就有__proto__属性,该属性对应”Function.prototype”,也就是说,”Function._proto_ === Function.prototype”。

在这里对“prototype”和“proto”进行简单的介绍:
对于所有的对象,都有__proto__属性,这个属性对应该对象的原型.
对于函数对象,除了__proto__属性之外,还有prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的__proto__属性)

JS原型、原型链深入理解

原型链结构图

原型链
因为每个对象和原型都有原型,对象的原型指向原型对象,
而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。

一、属性查找
当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止,到查找到达原型链的顶部(也就是 Object.prototype),如果仍然没有找到指定的属性,就会返回 undefined。

function Person(name, age){ 
    this.name = name; 
    this.age = age; 
  } 
Person.prototype.MaxNumber = 9999;
Person.__proto__.MinNumber = -9999;
var will = new Person("Will", 28); 
console.log(will.MaxNumber); // 9999 
console.log(will.MinNumber); // undefined

在这个例子中分别给”Person.prototype “和” Person.proto”这两个原型对象添加了”MaxNumber “和”MinNumber”属性,这里就需要弄清”prototype”和”proto”的区别了。

“Person.prototype “对应的就是Person构造出来所有实例的原型,也就是说”Person.prototype “属于这些实例原型链的一部分,所以当这些实例进行属性查找时候,就会引用到”Person.prototype “中的属性。

对象创建方式影响原型链

var July = { 
    name: "张三", 
    age: 28, 
    getInfo: function(){ 
      console.log(this.name + " is " + this.age + " years old"); 
    }
  } 
 console.log(July.getInfo());

当使用这种方式创建一个对象的时候,原型链就变成下图了. July对象的原型是”Object.prototype”也就是说对象的构建方式会影响原型链的形式。

JS原型、原型链深入理解

{}对象原型链结构图

综图所述
1. 所有的对象都有__proto__属性,该属性对应该对象的原型.
2. 所有的函数对象都有prototype属性,该属性的值会被赋值给该函数创建的对3. 象的_proto_属性.
4. 所有的原型对象都有constructor属性,该属性对应创建所有指向该原型的实例的构造函数.
5. 函数对象和原型对象通过prototype和constructor属性进行相互关联.

以上就会关于JS原型、原型链的详细内容介绍,希望对大家的学习有所帮助。

Javascript 相关文章推荐
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
Jun 19 Javascript
filters.revealTrans.Transition使用方法小结
Aug 19 Javascript
JavaScript实现网站访问次数统计代码
Aug 12 Javascript
快速掌握Node.js环境的安装与运行方法
Feb 16 Javascript
JS实现淡入淡出图片效果的方法分析
Dec 20 Javascript
JS生成一维码(条形码)功能示例
Jan 19 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
May 17 Javascript
vue-router路由参数刷新消失的问题解决方法
Jun 17 Javascript
tangram.js库实现js类的方式实例分析
Jan 06 Javascript
laydate时间日历插件使用方法详解
Nov 14 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
Mar 13 Javascript
微信小程序导航栏跟随滑动效果的实现代码
May 14 Javascript
Javascript中Date类型和Math类型详解
Feb 27 #Javascript
原生javascript实现匀速运动动画效果
Feb 26 #Javascript
探索angularjs+requirejs全面实现按需加载的套路
Feb 26 #Javascript
JavaScript代码生成PDF文件的方法
Feb 26 #Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
Feb 26 #Javascript
自动完成的搜索框javascript实现
Feb 26 #Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
Feb 26 #Javascript
You might like
PHP多线程抓取网页实现代码
2010/07/22 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
js实现微信分享代码
2020/10/11 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
python爬取51job中hr的邮箱
2016/05/14 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
python 模块导入问题汇总
2021/02/01 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
入党推优材料
2014/06/02 职场文书
团队激励口号
2014/06/06 职场文书
美术社团活动总结
2014/06/27 职场文书
单位工作证明格式模板
2014/10/04 职场文书
导游欢送词
2015/01/31 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python