函数的 prototype 属性是构造函数独有的显式原型指针,指向供实例共享的原型对象;实例通过 proto 链接至该 prototype,形成委托查找的原型链,实现方法复用与继承。

函数的 prototype 属性是理解构造函数与实例之间原型关联的核心入口。它不是实例身上的属性,而是**仅属于函数对象**的一个显式原型指针,指向一个专门用于被实例共享的对象——即“原型对象”。
prototype 是构造函数的“共享仓库”
当你定义一个函数(如 function Person() {}),JavaScript 引擎会自动为其添加 prototype 属性,其值是一个普通对象(默认含 constructor 属性)。这个对象就是所有通过 new Person() 创建的实例所共用的“方法和属性仓库”。
- 往
Person.prototype上添加方法(如sayHello() {}),所有person1、person2实例都能调用,且不重复创建函数,节省内存; - 这个仓库对实例是“只读可见”的——实例自身没有
prototype,但能通过内部机制访问它; - 修改
prototype对象的属性或方法,会立即反映在所有已有和后续实例上(动态性)。
实例通过 __proto__ 链接到 prototype
每次用 new 调用构造函数时,新生成的实例对象会自动获得一个内部属性(标准叫 [[Prototype]]),在绝大多数引擎中可通过 __proto__ 访问。它的值被设为该构造函数的 prototype 值。
-
const p = new Person();→p.__proto__ === Person.prototype为 true; - 这个链接不是复制,而是一条查找路径:当访问
p.sayHello时,若p自身无此属性,JS 就顺着__proto__去Person.prototype中找; - 注意:
__proto__是实例的隐式原型,prototype是构造函数的显式原型,二者指向同一对象,但归属不同。
constructor 属性维持反向连接
每个函数的 prototype 对象默认带有一个 constructor 属性,它指向该函数本身。
-
Person.prototype.constructor === Person成立; - 这使得实例可以通过
p.__proto__.constructor或直接p.constructor知道自己由谁构造; - 如果你整个替换
Person.prototype = {...},记得手动补上constructor: Person,否则这个反向链接就断了。
原型链由此延伸出去
Person.prototype 本身也是一个普通对象,所以它也有自己的 __proto__。这条链会继续向上:
Person.prototype.__proto__ === Object.prototype →
Object.prototype.__proto__ === null(链的终点)。
- 这意味着
Person实例不仅能访问Person.prototype上的方法,也能访问Object.prototype上的通用方法(如toString()、hasOwnProperty()); - 这就是“继承”的底层机制:不是拷贝,而是逐级委托查找。

















