写代码啦
原型与原型链
回复数(0) 浏览数(24)
{{topic.upvote_count || 0}} 编辑 回复

今天,我们来一起讨论一下关于原型和原型链的问题。

首先,我们来看一下下列代码:

  • 代码
    let arr = [1, 3, 2, 0]
    arr.reverse()
    arr.toString()

对于上述代码,调用arr.reverse()的时候会让数组实现逆序排,调用arr.toString()会用字符串形式展示数组内容。那么问题来了,arr的reverse方法是在哪里定义的?toString方法是哪里定义的?

原型

  1. 原型分为两种:直接原型和间接原型
  • 对于普通对象来说,Object.prototype是直接原型;

  • 对于函数和数组来说,Object.prototype是间接原型。

  1. 每个对象都有原型,原型里存放着对象的共有属性;

  2. 对象的原型也是对象;

  3. 对象的原型也有原型。

  • Object.prototype保存了一个对象的地址,这个对象包含了所有普通对象的共有属性,叫做对象的原型;

  • Array.prototype保存了一个对象的地址,这个对象包含了所有数组的共有属性,叫做对象的原型;

  • Function.prototype保存了一个对象的地址,这个对象包含了所有函数的共有属性,叫做对象的原型。

原型链

JavaScript中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链。

所有原型链的终点都是Object函数的prototype属性,因为在JavaScript中的对象都默认由Object()构造。Objec.prototype指向的原型对象同样拥有原型,不过它的原型是null,而null则没有原型。
所以查找属性的时候查到 Object.prototype 就可以停止查找了。

重要知识

  1. JS公式
  • 对象.proto === 其构造函数.prototype
  1. 根公理
  • Object.prototype是所有对象的(直接或间接)原型
  1. 函数公理
  • 所有函数都是由Function构造的

解决问题

image.png
image.png

回到最开始的问题,如图所示,arr有一个隐藏属性(proto),该隐藏属性存储了Array.prototype对象的地址。arr.reverse以及arr.toString发现arr自身没有这些reverse以及toString之后,就去隐藏属性对应的对象里去找,发现在Array.prototype中有,就拿来进行使用了。

版权声明

本内容版权归属本人及杭州饥人谷教育科技有限公司(简称:饥人谷)所有。
任何媒体、网站或个人未经授权不得转载、链接和转贴,或以其他方式复制、发布和发表。
对于违反者,将依法追究责任。

{{topic.upvote_count || 0}}

今天,我们来一起讨论一下关于原型和原型链的问题。

首先,我们来看一下下列代码:

  • 代码
    let arr = [1, 3, 2, 0]
    arr.reverse()
    arr.toString()

对于上述代码,调用arr.reverse()的时候会让数组实现逆序排,调用arr.toString()会用字符串形式展示数组内容。那么问题来了,arr的reverse方法是在哪里定义的?toString方法是哪里定义的?

原型

  1. 原型分为两种:直接原型和间接原型
  • 对于普通对象来说,Object.prototype是直接原型;

  • 对于函数和数组来说,Object.prototype是间接原型。

  1. 每个对象都有原型,原型里存放着对象的共有属性;

  2. 对象的原型也是对象;

  3. 对象的原型也有原型。

  • Object.prototype保存了一个对象的地址,这个对象包含了所有普通对象的共有属性,叫做对象的原型;

  • Array.prototype保存了一个对象的地址,这个对象包含了所有数组的共有属性,叫做对象的原型;

  • Function.prototype保存了一个对象的地址,这个对象包含了所有函数的共有属性,叫做对象的原型。

原型链

JavaScript中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链。

所有原型链的终点都是Object函数的prototype属性,因为在JavaScript中的对象都默认由Object()构造。Objec.prototype指向的原型对象同样拥有原型,不过它的原型是null,而null则没有原型。
所以查找属性的时候查到 Object.prototype 就可以停止查找了。

重要知识

  1. JS公式
  • 对象.proto === 其构造函数.prototype
  1. 根公理
  • Object.prototype是所有对象的(直接或间接)原型
  1. 函数公理
  • 所有函数都是由Function构造的

解决问题

image.png
image.png

回到最开始的问题,如图所示,arr有一个隐藏属性(proto),该隐藏属性存储了Array.prototype对象的地址。arr.reverse以及arr.toString发现arr自身没有这些reverse以及toString之后,就去隐藏属性对应的对象里去找,发现在Array.prototype中有,就拿来进行使用了。

版权声明

本内容版权归属本人及杭州饥人谷教育科技有限公司(简称:饥人谷)所有。
任何媒体、网站或个人未经授权不得转载、链接和转贴,或以其他方式复制、发布和发表。
对于违反者,将依法追究责任。

24
回复 编辑