JavaScript构造函数的prototype属性是其实例共享方法和属性的源头,实例通过[[Prototype]]链指向它;仅对new调用生效,与__proto__不同但紧密绑定。

JavaScript构造函数的prototype属性,本质是为该构造函数创建的**所有实例对象提供共享的方法和属性的源头**。它不是实例自身的属性,而是实例在访问属性或方法时,沿着原型链向上查找的**第一个共享参照对象**。
prototype是实例的“方法仓库”入口
当你用new Foo()创建实例时,JavaScript引擎会自动将该实例的内部属性[[Prototype]](可通过Object.getPrototypeOf()访问)指向Foo.prototype。这意味着:
- 实例自身没有定义的方法(如
instance.sayHello),会去Foo.prototype上查找; - 所有
new Foo()产生的实例,共享同一份Foo.prototype,因此修改它会影响所有已有和未来的实例; -
Foo.prototype.constructor默认指向Foo,这是构造函数与原型之间的双向关联锚点。
prototype只影响“通过new调用”产生的对象
prototype仅对使用new操作符调用构造函数生成的对象生效。以下情况不走这条链:
- 直接调用
Foo()(非new):不会设置[[Prototype]],返回值通常是undefined(除非显式return对象); - 对象字面量
{}或Object.create(null):它们的[[Prototype]]分别指向Object.prototype或null,与任何构造函数的prototype无关; - 箭头函数、普通函数表达式等非构造函数:没有
prototype属性(或虽有但无意义)。
底层机制依赖隐式原型链([[Prototype]])
JavaScript引擎在属性访问时执行的是“原型链查找”:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
立即学习“Java免费学习笔记(深入)”;
- 先查实例自身是否有该属性(
hasOwnProperty为true); - 没有则查
[[Prototype]]指向的对象(即Constructor.prototype); - 仍没有,继续查该对象的
[[Prototype]](如Object.prototype),直到null为止。
这个链条的起点,正是构造函数的prototype所指定的对象——它是自定义类型在原型链上的第一站。
注意:prototype ≠ __proto__,但二者紧密绑定
prototype是**函数对象独有的属性**,用于规定“未来实例的[[Prototype]]该是什么”;而__proto__(已不推荐使用)或Object.getPrototypeOf()读取的是**某个具体对象的[[Prototype]]内部槽**。例如:
function Person(name) { this.name = name; }
Person.prototype.say = function() { return 'Hi'; };
const p = new Person('Alice');
// p.__proto__ === Person.prototype → true
// Person.prototype.__proto__ === Object.prototype → true
这种绑定发生在new执行的瞬间,由引擎内部完成,开发者不可见但可依赖。

















