[耗砸] 原型链梳理

80 阅读1分钟

好记性不如烂笔头,我说的

1、几个名词概念

  • 构造函数:可以通过new 关键词来调用的函数
  • 实例:通过new关键词得到的对象
  • 原型属性
    • 针对函数来说,指的是函数对象上的prototype属性,注意只有函数才有prototype属性
    • 针对对象来说,指的是当前对象上的__proto__(非标准)属性,书面写作[[Prototype]]

2、基础知识点

  • 构造函数本身也是一个对象,它既有 prototype 属性,也有 __proto__属性
  • prototype__proto__ 属性也是对象
  • 构造函数的 prototype 属性上有一个 constructor属性,它指向了构造函数本身, 即:Function.prototype.constructor === Function
  • 正常创建的对象都有 __proto__属性, Object.create(null)没有__proto__
  • 访问对象上的属性时候,会现在当前对象上查找,如果找不到再去 [[Prototype]]上找,如果 [[Prototype]]上没有,则从[[Prototype]][[Prototype]]上继续找,如此往复一直到null

3、结论

  • Object.__proto__ === Function.prototype // 简单点理解: const Object = new Function()
  • Object.prototype.__proto__ === null // Object作为构造函数,是所有对象的基类。
  • Function.__proto__ === Function.prototype // Function本身也是一个函数,同时Function也是所有函数的基类,简单理解: const Function = new Function()
  • Function.prototype.__proto__ === Object.prototype // Function.prototype本身也是一个对象,所以他的原型指向Object的原型
  • 所有非继承的构造函数的 [[Prototype]]都指向了Function的prototype,例如: String.__proto__ === Function.prototype