javascript中用原型对象复用通用代码,需将共用方法定义在构造函数的prototype上以实现共享和节省内存,避免在prototype上直接定义引用类型值,并可用object.assign批量添加方法或使用class语法糖。

在 JavaScript 中,用原型对象复用通用代码,核心是把多个实例共用的方法和属性定义在构造函数的 prototype 上,而不是在构造函数内部重复创建。这样所有实例共享同一份方法,节省内存,也便于统一维护。
把共用方法挂到 prototype 上
每次用 new 创建实例时,如果方法写在构造函数里(比如 this.sayName = function() {...}),每个实例都会生成一份独立副本。而写在 prototype 上,所有实例通过原型链访问同一个函数:
function Person(name, age) {
this.name = name;
this.age = age;
}
// ✅ 共用方法放 prototype
Person.prototype.sayName = function() {
console.log('我是 ' + this.name);
};
Person.prototype.getAge = function() {
return this.age;
};
const p1 = new Person('张三', 25);
const p2 = new Person('李四', 30);
p1.sayName(); // 我是 张三
p2.sayName(); // 我是 李四
console.log(p1.sayName === p2.sayName); // true —— 同一个函数
避免在 prototype 上直接放引用类型值
原型是共享的,如果在 prototype 上定义数组、对象等引用类型,所有实例会共用同一份数据,容易互相干扰:
// ❌ 危险:所有实例共享同一个数组
Person.prototype.hobbies = [];
p1.hobbies.push('读书');
console.log(p2.hobbies); // ['读书'] —— 李四也被影响了!
// ✅ 正确:在构造函数中初始化引用类型
function Person(name, age) {
this.name = name;
this.age = age;
this.hobbies = []; // 每个实例独有
}
可以用 Object.assign 批量添加原型方法
当方法较多时,逐个赋值 prototype.xxx = ... 冗长。可用 Object.assign 一次性挂载一组方法:
Object.assign(Person.prototype, {
sayName() {
console.log('我是 ' + this.name);
},
isAdult() {
return this.age >= 18;
},
introduce() {
console.log(`${this.name},${this.age}岁`);
}
});
现代替代方案:class 语法更清晰
ES6 的 class 是原型机制的语法糖,语义更明确,推荐新项目使用:
class Animal {
constructor(name) {
this.name = name;
}
// 方法自动加到 Animal.prototype 上
speak() {
console.log(this.name + ' 叫了一声');
}
static createSilent() {
return new Animal('静音兽');
}
}
const dog = new Animal('旺财');
dog.speak(); // 旺财 叫了一声
不复杂但容易忽略Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











