原型对象是JavaScript中实现方法共享和继承的底层真实对象,每个函数的prototype属性指向它,实例通过[[Prototype]]链访问其方法,查找失败时沿原型链向上直至null。

原型对象是 JavaScript 中实现方法共享和继承的底层载体,不是语法糖,而是运行时真实存在的对象。它让多个实例复用同一份方法定义,避免重复创建、节省内存,也保证逻辑修改只需一处生效。
原型对象的核心定位
每个函数(构造函数)都有一个 prototype 属性,它默认指向一个普通对象,这个对象就是“原型对象”。该对象天然带有一个 constructor 属性,指向原函数本身。
- 原型对象不是给构造函数用的,而是给它的所有实例“共用”的能力仓库
- 实例自身不存方法,而是通过内部链接(
[[Prototype]],可读为__proto__)连到原型对象上 - 你往
Person.prototype上加方法,所有new Person()出来的对象都能直接调用
怎么正确添加方法到原型
推荐在构造函数定义后,逐个挂载方法,保持 constructor 指向不变:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
function Car(brand) {
this.brand = brand;
}
Car.prototype.start = function() {
console.log(`${this.brand} engine started`);
};
Car.prototype.stop = function() {
console.log(`${this.brand} engine stopped`);
};
const c1 = new Car('Tesla');
const c2 = new Car('BMW');
console.log(c1.start === c2.start); // true —— 同一份函数
- 避免直接赋值整个新对象:
Car.prototype = { start() {...} },否则会丢失constructor,且新创建的实例无法识别自己是谁造的 - 若必须重写整个原型,记得手动修复:
Car.prototype.constructor = Car
原型对象的查找与链式作用
当你访问 c1.start(),引擎按顺序查找:
立即学习“Java免费学习笔记(深入)”;
- 先查
c1自身有没有start属性 → 没有 - 再查
c1.__proto__(即Car.prototype)→ 找到 - 如果没找到,继续查
Car.prototype.__proto__(即Object.prototype)→ 这里有toString、hasOwnProperty等通用方法 - 最终到
Object.prototype.__proto__ === null,链结束
这种逐级向上找的机制,就是原型链——它让所有对象天然继承基础能力,无需显式声明。
实际开发中的典型用法
-
扩展内置类型:比如给所有数组添加
.last()方法(注意慎用,避免污染全局) -
模拟私有字段+公有方法组合:把数据存在实例上(
this._id),把操作逻辑放在原型上(Item.prototype.save) -
轻量级继承搭建:子类构造函数的
prototype指向父类实例,再修正constructor,就构成简单继承链 -
动态增强行为:运行时给某个构造函数的
prototype增加调试方法,所有已有/未来实例立即可用

















