美文网首页编程程序员
从实现角度分析js原型链

从实现角度分析js原型链

作者: xiedacon | 来源:发表于2017-08-30 16:36 被阅读97次

从实现角度分析js原型链

欢迎来我的博客阅读:《从实现角度分析js原型链》

网上介绍原型链的优质文章已经有很多了,比如说:

作为补充,就让我们换个角度,从实现来分析一下吧

ps: 本文假设你对原型链已经有所了解。如不了解,建议先看上面两篇文章

画个图

第一步

创建一个函数时,会创建两个对象:函数本身和它的原型对象

第一步

所以我们可以先画个这样的关系图:

示例1

ps: 圆形代表函数,矩形代表对象

第二步

通过函数创建的对象,其原型是函数的原型对象

第二步

再修改下关系图:

示例2

第三步

函数的原型对象的原型是 Object 的原型对象

第三步

再修改下关系图:

示例3

第四步

js的内置函数对象也满足这个规律

第四步

再修改下关系图:

示例4

第五步

Function 的原型对象是一个函数

第五步

再修改下关系图:

示例5

第六步

所有函数的原型都相同,都为 Function 的原型对象

第六步

再修改下关系图:

示例6

第七步

Object 的原型对象的原型是 null 意为不应该存在

第七步

最后得到如下关系图:

关系图

一些疑问

instanceof

Object instanceof Function // true
Function instanceof Object // true

首先需要确定的是,instanceof 运算符相当于如下代码:

// L instanceof R
function instance_of(L, R) {
 var O = R.prototype; // 取函数 R 的原型对象
 L = L.__proto__;     // 取对象 L 的原型
 while (true) {       // 遍历原型链
   if (L === null)
     return false; 
   if (O === L)       // 函数 R 的原型对象在对象 L 的原型链上
     return true; 
   L = L.__proto__; 
 } 
}

对于 Object instanceof Function 来说,就相当于 Object.__proto__ === Function.prototype

因为所有函数的原型都是 Function 的原型对象,所以是 true

对于 Function instanceof Object 来说,就相当于 Function.__proto__ === Object.prototype

因为 Object 的原型对象处于原型链的顶部,所以 Object.prototype 一定在 Function 的原型链上,为 true

Function

Function.__proto__ === Function.prototype

对于这个,可以先把上面的关系图变形一下:

变形

可以看出:

  1. 所有函数都有与之对应的原型对象
  2. 所有函数的原型都是 Function.prototype
  3. Object.prototype 位于原型链的顶部,在所有对象的原型链上

根据 1 和 2,就可以得出 Function.__proto__ === Function.prototype

至于 Function.prototype 为什么是函数,可以先看看下面这个例子:

例子

可以看出,Array.prototype 是 Array 类型,Map.prototype 是 Map 类型,Set.prototsype 是 Set 类型

所以,为了保持一致性,Function.prototype 也应该是 Function 类型

End

参考:

相关文章

  • 从实现角度分析js原型链

    从实现角度分析js原型链 欢迎来我的博客阅读:《从实现角度分析js原型链》 网上介绍原型链的优质文章已经有很多了,...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • js继承

    js继承js 继承-简书 原型链实现集继承 上面的代码实现原型链继承最重要的son.prototype=new f...

  • js基础之实现继承的几种方式

    js 实现继承的方式有: 原型链继承; 构造函数继承; 组合继承(原型链继承 + 构造函数继承)(最常用);(原型...

  • js实现继承的几种方式

    如何实现继承? js中实现继承的方式主要是通过原型链完成的。了解原型链的相关信息可以点这里 javascript中...

  • 2018-01-09 关于javascript原型链的思考 pl

    s 深入理解原型和原型链? 构造函数 理解原型和原型链 new的时候js都干了什么? 一个实现继承的demo 构造...

  • js实现继承的几种方式

    js实现继承有几种方式,这里我们主要探讨 原型链继承 构造继承 组合继承(原型链和构造继承组合到一块,使用原型链实...

  • class extends语法糖的实质

    class的使用 通过class创建类(实质是函数) 分析 对js原型链熟悉的人应该能很快理解(ps: js:原型...

  • 2018-10-29 关于js原型链的讨论

    起源:为什么使用原型链 使用原型链是为了实现继承,那js的继承为什么选择了原型链呢?我们来看看网络的解释 http...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

网友评论

    本文标题:从实现角度分析js原型链

    本文链接:https://www.haomeiwen.com/subject/qnxxjxtx.html