JavaScript通过原型实现内存复用:方法定义在prototype上供实例共享,避免重复创建;不可变行为放原型,可变数据在构造函数内初始化;Object.create可手动设置原型链;class是原型的语法糖,语义更清晰。

JavaScript 通过原型对象实现高效内存复用,核心在于「把共享的方法和属性放在原型上,而非每个实例中重复创建」。这避免了为成百上千个对象各自分配一份相同函数的内存空间。
把方法定义在构造函数的 prototype 上
这是最直接、最常用的方式。所有实例共用同一个函数引用,只占用一份内存:
function User(name, age) {
this.name = name;
this.age = age;
}
// ✅ 方法放 prototype → 共享一份
User.prototype.greet = function() {
return `Hello, I'm ${this.name}`;
};
// ❌ 不要这样写(每个实例都新建一个函数)
// this.greet = function() { ... };
创建 1000 个 User 实例时,greet 方法仅存在一份,而不是 1000 份。
避免在原型上存放可变的共享数据
原型是被所有实例共享的,如果在 prototype 上直接放数组、对象等引用类型,修改会影响所有实例:
立即学习“Java免费学习笔记(深入)”;
// ⚠️ 危险:所有实例共享同一个 hobbies 数组
User.prototype.hobbies = [];
const u1 = new User('Alice', 25);
const u2 = new User('Bob', 30);
u1.hobbies.push('reading');
console.log(u2.hobbies); // ['reading'] ← 意外被改了!
正确做法是:在构造函数内部初始化实例专属数据,只把不可变行为(方法)交给原型。
利用 Object.create 设置干净的原型链
当需要手动构建对象关系(比如模拟继承或复用模板),用 Object.create(prototype) 创建新对象,其 [[Prototype]] 直接指向指定原型,不执行构造函数,开销更低:
const animalMethods = {
speak() { console.log(`${this.name} makes a sound`); }
};
// 创建实例,不调用构造函数,直接关联原型
const dog = Object.create(animalMethods);
dog.name = 'Buddy';
dog.speak(); // Buddy makes a sound
这种方式跳过了 new 的初始化流程,适合轻量级对象复用场景,比如配置对象、策略对象。
结合 class 语法保持语义清晰
ES6 的 class 是原型机制的语法糖,底层仍依赖 prototype。使用它能让复用意图更明确:
class Vehicle {
constructor(brand) {
this.brand = brand; // 实例独有
}
// ✅ 自动挂到 Vehicle.prototype 上
start() {
console.log(`${this.brand} engine started`);
}
}
const car = new Vehicle('Toyota');
const bike = new Vehicle('Giant');
console.log(car.start === bike.start); // true ← 同一个函数
class 写法不会改变原型复用的本质,但提升了可读性和维护性,也便于后续做静态分析或工具优化。


















