博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一张图彻底理解Javascript原型链
阅读量:6909 次
发布时间:2019-06-27

本文共 1966 字,大约阅读时间需要 6 分钟。

代码

讲解用到的代码很简单,如下

function Foo(){    //属性和方法}var f1 = new Foo();var f2 = new Foo(); var o1 = new Object();var o2 = new Object();复制代码

基础了解

一切皆对象,对象又可以分为两类:

  1. 普通对象 ,除了函数对象之外的对象都是,包括new函数对象()产生的实例,普通对象没有prototype,也就没有继承和原型链一说。
  2. 函数对象 ,包括两种:
  • 由function创造出来的函数:

    function f1() {      } // 匿名函数      var f2 = function() {      }      var f3 = new Function('x','console.log(x)');      // 以上都是函数对象复制代码
  • 系统内置的函数对象: FunctionObject、Array、String、Number ,Function其实充当了函数对象的构造器,比如Object对象的构造源码其实是Function Object() {[native code]}的形式,这一点对于理解原型链很重要。

进入正题

上图从结构上分为实例对象、Functions函数对象、prototype原型对象三部分,图中f1、f2的原型链我特意标成了红色,Foo的原型链为紫色。

每个对象都有__proto__属性,用于储存继承得来的方法和属性;每个函数对象都有prototype属性,用于继承,将其中定义的属性和方法传递给‘后代’(比如实例化)。

如何实现原型继承

f1为何有Foo、Object的原型方法,其实就是通过原型链继承。继承的过程可以表示为f1.__proto__ = Foo.prototype,即对象.__proto__ = 构造器.prototype

new实例实现继承的过程其实与上面原理相同,new的过程可以拆解为下面几个步骤:

var temp = {};temp.__proto__ = Foo.prototype; // 原型继承var f1 = Foo.call(temp);return f1;复制代码

找出原型链

1) f1的原型链(红色虚线)。

  1. f1为普通对象,它的构造器为Foo,以Foo为原型,原型链第一链为f1.__proto__ == Foo.prototype
  2. Foo.prototype(注意这边不是Foo)为json对象,即普通对象,构造器为Object,以Object为原型,得出原型链第二链Foo.prototype.__proto__ == Object.prototype;
  3. Object.prototype以Null为原型,原型链第三链为Object.prototype.__proto__ == null

 f1的原型链可以用图形表示:

 可以在浏览器console打印验证:

2) Foo的原型链(紫色虚线)

  1. Foo为函数对象,它的构造器为Function,以Function为原型,原型链第一链为Foo.__proto__ == Function.prototype;
  2. Function.prototype为json对象,即普通对象,构造器为Object,以Object为原型,原型链第二链为Function.prototype.__proto__ == Object.prototype;
  3. 最后Object.prototype以Null为原型,原型链第三链为Object.prototype.__proto__ == null;

 Foo的原型链可以用图形表示为:

 可以在浏览器console打印验证:

3)小结

列出两种原型链的目的是:

当js引擎执行对象的属性或方法时,先查找对象本身是否存在该方法,如果不存在则会在原型链上查找。

因而f1拥有Foo、Object的原型方法,Foo拥有Function、Object的原型方法。

注意,虽然f1原型链其中有一链是涉及到函数对象Foo,但f1并不拥有Function的原型方法,因为原型链并没有延伸到Function。

比如下图中bind是Function的原型方法,f1并没有拥有。

总结

如何找出一个对象的原型链,只需要两步

  1. 判断对象是普通对象还是函数对象,得出对象的构造器
  2. 对象.proto = 构造器.prototype

关于最上面的图形,只剩Object和Function的特殊关系和构造函数constructor没有讲到, 了解Object和Function的关系,

如果有讲不清和讲错了的地方,请帮我指出来,我也跟大家一起在学习中,请轻喷(●ˇ∀ˇ●)

转载地址:http://tegdl.baihongyu.com/

你可能感兴趣的文章
《趣学CCNA——路由与交换》——6.1节Cisco设备的管理与配置
查看>>
Android 被曝多处安全漏洞 影响所有版本
查看>>
《数据结构与算法 C语言版》—— 3.2栈的应用举例
查看>>
在Linux上的虚拟机上启动Oracle上报ORA-00845: MEMORY_TARGET not supported on this system的问题解决...
查看>>
《Cisco IOS XR技术精要》一4.3 配置管理组件
查看>>
《社会智能与综合集成系统》—第2章参考文献
查看>>
《Adobe Photoshop CS5中文版经典教程(全彩版)》—第2课2.4节在Camera Raw中调整颜色...
查看>>
《Adobe Premiere Pro视频编辑指南(第2版)》——水银回放引擎
查看>>
从零开始打造个人专属命令行工具集——yargs 完全指南
查看>>
Spark源码分析 -- SchedulableBuilder
查看>>
《HTML5+CSS3网页设计入门必读》——第1章 理解Web的工作方式1.1 HTML和WWW简史
查看>>
真的吗?算法谋取暴利,让你多花钱
查看>>
Linux 内核测试和调试(5)
查看>>
指针与数组
查看>>
Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
查看>>
《C++面向对象高效编程(第2版)》——1.12 OOP 范式和语言
查看>>
《Java遗传算法编程》—— 1.4 进化计算的优势
查看>>
《R语言数据挖掘》——2.3 混合关联规则挖掘
查看>>
Commons IO 官方文档
查看>>
《精通Linux设备驱动程序开发》——第1章 引言 1.1演进
查看>>