javascript原型链-review

写在前面

虽然现在es8都已经在预发布阶段了,但是无论发布到es几,其本身的运作原理都是一样的。

首先祭上一张图, 这张图主要描述了以下的关系,如果觉的这里的说明过于复杂可以直接看最后一段

简单说明

关于function(class)A和它的原型之间的关系

A.prototype.constructorA等价

关于function(class)A的实例a与它的原型之间的关系

a.__proto__A.prototype等价

在上面两个等价条件的基础上,就可以很容易得到

a.__proto__.prototype.constructorA等价

这是一般的类和对象实例之间的原型继承关系。

在此基础上,对于ObjectFunction还有一些特殊的关系。

关于function(class)AFunction之间的关系

A.__proto__Function.prototype等价

关于function(class)A的原型和Object之间的关系

A.prototype.__proto__Object.prototype等价

关于Function的原型和Object之间的关系

Function.prototype.__proto__Object.prototype等价

所以也可以很容易知道

A.__proto__.__proto__Object.prototype等价

Object对象比较特殊,因为它是所有对象的根,所以约定它的原型所指向的原型对象为空

Object.prototype.__proto__null等价

同时javascript中一切皆为对象,但Object本身是一个构造函数,因此它本身的原型对象指向Function.prototype

Object.__proto__Function.prototype

总结

所以无论是es5风格的继承还是es6风格的继承语法,原型链的形成是都是通过__proto__prototype描述的,举个例子,这里使用es6, 即:

如果有:

class B extends A {}
const a = new B()

则有:

  • a.__proto__ === B.prototype
  • B.prototype.constructor.__proto__ === B.__proto__
  • B.__proto__ === A
  • A.prototype.constructor.__proto === A.__proto__
  • A.__proto__ === Function.prototype
  • Function.prototype.__proto__ === Object.prototype
  • Object.prototype.__proto__ === null

其他的以此类推。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏gaoqin31

c语言函数的隐式声明

编译器只有碰到函数原型的时候才知道这个函数的名字,参数类型个数返回值,到函数调用的时候才知道如何生成指令,所以函数原型必须出现在函数调用之前。

27420
来自专栏数据科学学习手札

(数据科学学习手札48)Scala中的函数式编程

  Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍;

14440
来自专栏前端知识分享

第29天:js-数组添加删除、数组和字符串相互转换

一、添加数组 var arr=[1,3,5]; arr.push(7,9);//添加7和9到数组arr后面,得到[1,3,5,7,9] 1、push();可向数...

25210
来自专栏数据结构与算法

字符串匹配问题

、字符串匹配问题 【问题描述】        字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必...

40660
来自专栏vue学习

JSON

json是一种数据格式,不是一种编程语言。 json是一种轻量级的数据格式,可以简化表示复杂数据结构的工作量。

16830
来自专栏和蔼的张星的图像处理专栏

6. 合并排序数组

合并两个排序的整数数组A和B变成一个新的数组。 样例 给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 最简单...

19220
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——14,遍历字典

同列表元组一样,字典也能够遍历,但是和列表元组不一样的是,字典遍历分三个部分:遍历键值对、遍历键、遍历值 首先我们新建一个字典: score = {"engl...

27230
来自专栏咸鱼不闲

static关键字,面试经常被问到!(一)

static可以理解为全局的。 static可以修饰: 变量,方法,代码块,内部类。

34150
来自专栏行者常至

Java中的super 和 this

10510
来自专栏数据结构与算法

20:删除单词后缀

20:删除单词后缀 总时间限制: 1000ms 内存限制: 65536kB描述 给定一个单词,如果该单词以er、ly或者ing后缀结尾, 则删除该后缀(题目保...

43840

扫码关注云+社区

领取腾讯云代金券