原型对象面试核心三点:prototype是函数的属性,指向实例共享对象;__proto__是对象的隐式链,指向构造函数的prototype;constructor默认指回构造函数。原型链终点为null,路径为实例→构造函数prototype→Object.prototype→null。

直接点说:原型对象相关面试题,核心就考三点——prototype 是什么、__proto__ 怎么连、constructor 谁指向谁。答得清楚不绕弯,基本就能拿分。
先说清三个关键属性的关系
别一上来就背定义。用一句话串起来更有力:
- 每个函数都有 prototype 属性,它是个普通对象,用来放所有实例共享的方法和属性;
- 每个对象(包括函数)都有 __proto__ 属性,它指向“创建它的那个函数”的 prototype;
- prototype 对象自带 constructor 属性,默认指回它所属的构造函数。
比如:function Person() {},那么 Person.prototype.constructor === Person,而 new Person().__proto__ === Person.prototype。这个等式链记牢,很多题就迎刃而解。
原型链终点必须明确回答
问“原型链到哪结束”,不能只说“到 null”。要讲清楚路径:
- 实例对象 → 构造函数的 prototype → Object.prototype → Object.prototype.__proto__ 是 null;
- null 就是终点,不是 Object 或 Function;
- 特别注意:Function 的 __proto__ 指向 Function.prototype(因为函数也是 Function 构造出来的),而 Function.prototype.__proto__ 才是 Object.prototype。
区分 prototype 和 __proto__ 的本质差异
这是高频扣分点。一句话区分:
- prototype 是函数才有的显式属性,用于设置将来实例的原型;
- __proto__ 是对象(含函数)都有的隐式属性,表示“我从哪儿继承”;
- 它们之间没有父子关系,而是“实例的 __proto__ 指向构造函数的 prototype”——这是连接原型链的桥梁。
举例:const arr = [],arr.__proto__ === Array.prototype,而 Array.prototype.__proto__ === Object.prototype,所以 arr.toString() 能用,是因为沿着这条链找到了 Object 上的方法。
遇到判断题或代码题,按步骤拆解
比如题目:「var F = function(){}; var f = new F();,f 能否访问到 Object.prototype.a 和 Function.prototype.b?」
- 第一步:画出 f 的原型链 ——
f.__proto__ → F.prototype → Object.prototype → null; - 第二步:看 a 在不在链上 ——
Object.prototype.a在,能访问; - 第三步:看 b 在不在链上 ——
Function.prototype.b不在 f 的链上(f 不经过 Function.prototype),不能访问; - 补充一句:但
F.b可以,因为F.__proto__ === Function.prototype。
这种拆解法比死记硬背更稳,也显得逻辑清晰。


















