彻底搞懂原型及原型链(下)

103 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

上一篇写到涉及原型相关的一些基本概念以及原型和原型链的理论,这一篇对原型及原型链进行具体的分析

原型和原型链的类别

image.png

1. 函数.prototype

  • 前提结论:函数都是对象,每个函数都自带有一个属性叫做 prototype

  • 例子:

image.png

  • 结论: 每个函数下都有一个prototype属性,prototype的属性值是一个对象,这个对象默认的只有一个叫做constructor的属性,指向这个函数本身

  • 关系图:

image.png

2. 对象.__proto__

  • 前提结论: 每个对象都有一个隐藏的属性叫做 __proto__

  • 例子:

image.png

  • 解释:

    [[Prototype]]: 是对象的一个内部属性,chrome的引擎通过__proto__向外暴露了这个属性。实际上它可以看作就是对象的__proto__属性

    __proto__的值: 等于构造该对象的函数的prototype属性。testObj.__proto__ === testFun.prototype

  • 结论: 每个对象都有一个__proto__属性,指向该对象的函数的prototype

  • 关系图:

image.png

3. 函数.__proto__

  • 前提结论: 在JavaScript中,函数都是对象,是对象就有隐藏的__proto__属性
  • 解释: Function 是最顶级的构造器,函数对象都是通过他构造的
  • 结论: 函数.__proto__ === Function.prototype
  • 关系图:

image.png

4. 函数.prototype.__proto__

  • 解释:函数.prototype,他本质上是和 var obj = {} 是一样的,由 new Object创建
  • 结论:函数.prototype.__proto__ === Object.prototype
  • 关系图:

image.png

5. Object.__proto__

  • 解释: Object是由顶层构造函数Function构造的
  • 结论: Object.proto === Function.prototype
  • 关系图:

image.png

6. Object.prototype.__proto__

  • 结论: Object.prototype较为特殊,它是顶级对象的原型,所以它的_proto__指向是null
  • 关系图: image.png

7. Function.__proto__

  • 解释:函数对象都是由顶级构造函数Function创建。所以Function是被自身创建的
  • 结论: Function.__proto__ === Function.prototype
  • 关系图:

image.png

8. Function.prototype.__proto__

  • 解释:函数.prototype,它本质上是和 var obj = {} 是一样的,由new Object创建
  • 结论:Function.prototype.proto === Object.prototype
  • 关系图:

image.png

关于原型链的举例

  • 例子: 使用 toString()方法将数字转为字符串格式输出,同时打印Array原型对象 没有找到toString()方法
const arr = new Array(1,2,3)
console.log(arr.toString())

console.log(Array.prototype)

image.png

  • 解释:对象通过原型链进行查找,自身没有会通过原型链进行一层一层的查找,直到找到为止,所有的对象都属于Object,这里打印 Object的原型对象,发现有toString方法

image.png

原型链的作用

数据共享、节省内存空间

实现继承