prototype只有函数拥有,是其“原型对象仓库”;__proto__所有对象(除null)都有,是实例指向构造函数prototype的原型链接,new时自动绑定。

prototype 和 __proto__ 看似名字相似,实际职责完全不同:一个属于函数,是“造人用的图纸”;另一个属于所有对象,是“人身上指向图纸的指针”。搞清谁有、谁指谁、什么时候生效,原型链就不再迷路。
谁拥有 prototype?只有函数才有
prototype 是函数对象独有的属性,普通对象、数组、数字、字符串等都没有它。
-
函数才有:比如
function Person() {},Person.prototype存在且默认是个对象,含constructor属性 -
普通对象没有:如
const obj = {},obj.prototype是undefined -
内置构造器也有:如
Array.prototype、Date.prototype,它们提供.push()、.getFullYear()等共享方法
谁拥有 __proto__?所有对象(包括函数)都有
__proto__ 是每个对象(除 null)内部的隐式原型链接,本质是访问器属性,等价于 Object.getPrototypeOf(obj)。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
实例对象靠它找方法:比如
const p = new Person(),p.__proto__ === Person.prototype成立 -
函数也是对象,所以也有 __proto__:如
Person.__proto__ === Function.prototype,因为函数由 Function 构造 -
Object.prototype 是终点:它的
__proto__是null,原型链到此终止
它们怎么关联?new 的那一刻就绑定了
当你用 new 调用构造函数时,JavaScript 自动把新对象的 __proto__ 指向该函数的 prototype。
立即学习“Java免费学习笔记(深入)”;
-
function Foo() {}→Foo.prototype是一个普通对象 -
const f = new Foo()→f.__proto__被设为Foo.prototype - 后续访问
f.say():先查f自身,没找到就顺着f.__proto__找,即去Foo.prototype上查
常见误区提醒
别被表面迷惑,几个关键点要钉死:
-
prototype不是对象的“原型”,而是构造函数的“原型对象仓库” -
__proto__才是对象真正的“原型链接”,决定属性查找路径 -
Function.prototype.__proto__ === Object.prototype,这是标准设定,不是推导错误 - 不推荐直接写
obj.__proto__ = xxx,应使用Object.setPrototypeOf()或Object.create()

















