[原型链01]:prototype 和 __proto__ 的本质区别到底是什么?

8 阅读2分钟

第一轮提问(基础探测):

“大部分前端都能说出原型链这三个字,但我发现很多人连最基础的指针都没搞清楚。"

请直接回答两个问题:

  1. prototype__proto__ 的本质区别到底是什么?它们分别挂载在什么类型的对象上?
  2. 代码输出题:请告诉我下面这段代码的输出结果,并用一句话解释为什么。
const obj = {};
console.log(obj.prototype === obj.__proto__); 

请开始你的回答。

参考答案

  1. prototype__proto__ 的本质区别到底是什么?它们分别挂载在什么类型的对象上?
  • 一针见血的本质是

    • prototype 存在的唯一目的是作为模板(Blueprint)。它只存在于函数上(除了箭头函数等少数特例)。当你用 new 关键字调用函数时,JS 引擎需要一个“图纸”来决定给新对象加上什么属性,这个图纸就是 prototype
    • __proto__ 存在的唯一目的是形成链条(Link)。它是所有对象(包括函数)都有的内部属性(标准叫法是 [[Prototype]])。当你访问一个属性时,当前对象找不到,引擎就会顺着 __proto__ 这根“隐形的链条”往上找。

总结就是:prototype 是用来 给别人当爹(原型) 的,而 __proto__是用来 找自己的爹(原型) 的。


  1. 代码输出题:请告诉我下面这段代码的输出结果,并用一句话解释为什么。
const obj = {};
console.log(obj.prototype === obj.__proto__); 

image.png

深度剖析:

  1. obj 是一个普通的字面量对象 {}。它不是函数!它没有资格被 new 实例化,所以引擎根本不会给它分配 prototype 属性。
  2. 因此,访问 obj.prototype 的结果是 undefined
  3. 而 obj.__proto__ 如你所说,指向了 Object.prototype。
  4. 所以这个 console.log 的本质是比较 undefined === Object.prototype,结果必然是 false