prototype 详解

1 __proto__

1.1 是什么

__proto__ 是对象的属性(是对象内部属性 [[Prototype]] 的访问器),表示对象的原型,其值为创建此对象的构造函数的原型(prototype)。

1.2 有什么作用

  • 查询对象的原型
  • 组成原型链
    • 对象的原型 __proto__ 也有 __proto__ 属性,由一层层的 __proto__ 组成的链表,即所谓的原型链。当查询的属性没在当前对象上时,就会从对象的原型链上找,直到 __proto__ 为 null 还没找到时,才认为查询的属性为 undefined。

1.3 注意

  • 现在更推荐使用 Object.getPrototypeOf / Object.setPrototypeOf 来获取和设置对象的原型。

  • 修改对象的 __proto__ 属性时,对象必须是可扩展的(通过 Object.isExtensible() 判断),否则会抛出 TypeError 错误。

  • 修改的新值必须为 object 或 null,否则不会起作用。

2 prototype

2.1 是什么

prototype 是函数的属性,指向函数的原型。

2.2 有什么作用

prototype 的内容会被所有实例共享,甚至某个实例被创建后再修改构造函数的 prototype,都会反映到其他实例上。

2.3 注意

函数本质上也是对象,故构造函数也有 __proto__ 属性。

参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

https://blog.csdn.net/cc18868876837/article/details/81211729