javascript中函数的prototype属性是供实例共享方法和属性的公共能力池,每个函数创建时自动拥有指向默认对象的prototype,实例通过__proto__自动关联该原型并沿链查找方法。

JavaScript 中函数的 prototype 属性,本质是一个普通对象,它的核心作用是作为“公共能力池”,让所有通过该函数用 new 创建的实例,自动共享其中定义的方法和属性。
prototype 是构造函数的专属出口
每个函数(包括构造函数)在创建时,JS 引擎会自动为其添加一个 prototype 属性,它指向一个默认对象。这个对象不是给函数自己用的,而是专为未来所有实例预留的共享空间。
- 这个
prototype对象自带一个constructor属性,指向原函数本身,用于追溯来源; - 你往它上面添加方法或属性,比如
Person.prototype.say = function() {...},这些内容不会属于函数,也不会属于某个具体实例,而是“挂”在原型上,等待被所有实例沿链访问。
实例靠 __proto__ 自动连上 prototype
当你执行 const p = new Person(),引擎会做两件事:一是初始化实例自身属性(如 this.name),二是悄悄把实例内部的 [[Prototype]](可通过 p.__proto__ 或 Object.getPrototypeOf(p) 访问)指向 Person.prototype。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 这条连接是自动建立的,无需手动赋值;
- 因此
p.__proto__ === Person.prototype恒为true; - 这就是共享的物理基础:所有实例都指向同一个原型对象,自然能共用它上面的方法。
方法查找遵循“就近优先”规则
当调用 p.say() 时,JS 引擎按固定顺序查找:
- 先看
p自身有没有say属性(包括方法);有就直接用; - 没有,则顺着
p.__proto__去Person.prototype找; - 还没找到,继续往上查
Person.prototype.__proto__(即Object.prototype),直到null。
所以只要方法定义在 Person.prototype 上,所有实例都能调用,且实际调用的是同一份函数对象——p.say === q.say 返回 true。
避免常见误区:别在构造函数里重复定义方法
如果把方法写在构造函数内部,每次 new 都会新建一份,既浪费内存又破坏共享:
- ❌ 错误:
function Person() { this.say = function() {...} }→ 每个实例独占一个say; - ✅ 正确:
function Person() {} Person.prototype.say = function() {...}→ 所有实例共用一个say; - 若实例临时覆盖了同名方法(如
p.say = ...),原型上的版本会被遮蔽;删掉后,原型方法自动恢复可用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










