第一轮提问(基础探测):
“大部分前端都能说出原型链这三个字,但我发现很多人连最基础的指针都没搞清楚。"
请直接回答两个问题:
prototype和__proto__的本质区别到底是什么?它们分别挂载在什么类型的对象上?- 代码输出题:请告诉我下面这段代码的输出结果,并用一句话解释为什么。
const obj = {};
console.log(obj.prototype === obj.__proto__);
请开始你的回答。
参考答案
prototype和__proto__的本质区别到底是什么?它们分别挂载在什么类型的对象上?
-
一针见血的本质是:
prototype存在的唯一目的是作为模板(Blueprint)。它只存在于函数上(除了箭头函数等少数特例)。当你用 new 关键字调用函数时,JS 引擎需要一个“图纸”来决定给新对象加上什么属性,这个图纸就是prototype。__proto__存在的唯一目的是形成链条(Link)。它是所有对象(包括函数)都有的内部属性(标准叫法是 [[Prototype]])。当你访问一个属性时,当前对象找不到,引擎就会顺着__proto__这根“隐形的链条”往上找。
总结就是:prototype 是用来 给别人当爹(原型) 的,而 __proto__是用来 找自己的爹(原型) 的。
- 代码输出题:请告诉我下面这段代码的输出结果,并用一句话解释为什么。
const obj = {};
console.log(obj.prototype === obj.__proto__);
深度剖析:
- obj 是一个普通的字面量对象 {}。它不是函数!它没有资格被 new 实例化,所以引擎根本不会给它分配 prototype 属性。
- 因此,访问 obj.prototype 的结果是 undefined。
- 而
obj.__proto__如你所说,指向了 Object.prototype。 - 所以这个 console.log 的本质是比较 undefined === Object.prototype,结果必然是 false。