JavaScript原型模式的核心是让实例共享方法以节省内存,构造函数初始化属性、prototype存放共用方法;Object.create适用于纯原型继承;需避免在prototype上存独有数据或引用类型默认值;class只是prototype机制的语法糖。

JavaScript 原型模式下的对象创建,核心是让多个实例共享方法,避免重复定义函数浪费内存,同时保持对象类型可识别、行为可复用。它不是“额外技巧”,而是 JavaScript 语言底层机制的自然用法。
用构造函数 + prototype 添加共享方法
这是最常用也最符合运行时逻辑的方式:构造函数负责初始化实例属性,prototype 负责存放所有实例共用的方法。
- 构造函数只设置 this.name、this.age 等独有数据,不定义函数
- 把 sayName、drive 这类通用行为统一挂到 Constructor.prototype 上
- 每个 new 出来的实例都能调用这些方法,但它们实际指向同一个函数地址
示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
this.brand = brand;
}
Car.prototype.drive = function() {
console.log(this.brand + " 正在行驶");
};
const bmw = new Car("BMW");
const audi = new Car("Audi");
bmw.drive === audi.drive; // true
用 Object.create 直接指定原型对象
适合不需要构造函数逻辑、只想快速基于某个已有对象生成新对象的场景。它跳过 new 和 this 绑定,更贴近“纯原型继承”本质。
- 第一个参数是希望继承的对象(即新对象的 [[Prototype]])
- 第二个参数(可选)用于定义自有属性,支持属性描述符配置
- 新对象本身不带 constructor,也没有执行初始化逻辑,适合静态模板复用
示例:
const animal = {type: "哺乳动物",
eat() { console.log("进食中"); }
};
const cat = Object.create(animal);
cat.name = "咪咪";
console.log(cat.type); // "哺乳动物"
cat.eat(); // "进食中"
避免常见误区
原型模式容易被误用或理解偏差,关键点在于区分“谁该存什么”:
- 不要把实例独有数据写在 prototype 上——比如 Car.prototype.color = "red",会导致所有实例共享这个 color,改一个全变
- 不要在 prototype 上直接放引用类型默认值——如 prototype.items = [],同样会引发多个实例意外共享数组
- constructor 属性不是自动可靠的——手动修改 prototype 后,需显式修复:Car.prototype.constructor = Car
结合 ES6 class 理解原型模式
class 并非新机制,只是语法糖。class 中定义的实例方法,底层依然被添加到构造函数的 prototype 上。
- class Car { drive() { ... } } 等价于 Car.prototype.drive = function() { ... }
- static 方法则挂在构造函数本身,不进原型链
- extends 实际是通过 Object.setPrototypeOf(Child.prototype, Parent.prototype) 建立原型链
所以即使写 class,只要理解 prototype 的位置和查找规则,就能准确预判属性访问路径和内存行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










