在 javascript 中,构造函数中的原型方法应定义在构造函数的 .prototype 属性上,而不是在构造函数内部通过 this 绑定。这样做可以让所有实例共享同一份方法引用,节省内存并保证行为一致。

为什么不在构造函数内部定义方法
如果在构造函数内部使用 this.method = function() {...} 定义方法,每次创建新实例时都会生成一个新的函数对象。这不仅浪费内存,还导致不同实例的方法不相等,无法进行基于引用的比较或测试。

function Person(name) {
this.name = name;
// 错误做法:每个实例都拥有独立的 greet 函数
this.greet = function() {
return `Hello, I am ${this.name}`;
};
}
const p1 = new Person('Alice');
const p2 = new Person('Bob');
console.log(p1.greet === p2.greet); // false, 内存占用翻倍
如何正确定义原型方法
将方法添加到 Person.prototype 对象上,所有由 new Person() 创建的实例都会通过原型链访问到这些方法。这是 JavaScript 实现继承和共享行为的基石。

function Person(name) {
this.name = name;
}
// 正确做法:定义在 prototype 上
Person.prototype.greet = function() {
return `Hello, I am ${this.name}`;
};
const p1 = new Person('Alice');
const p2 = new Person('Bob');
console.log(p1.greet === p2.greet); // true, 共享同一个函数引用
console.log(p1.greet()); // "Hello, I am Alice"
原型链查找与属性遮蔽问题
当调用实例方法时,JavaScript 引擎会先在实例自身属性中查找,如果找不到,再沿着原型链向上查找。如果在实例上直接赋值同名属性,会遮蔽原型上的方法。理解这一机制对于调试和维护代码至关重要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











