javascript中原型对象挂载公共方法的核心是将函数赋值给构造函数的prototype属性,使所有实例共享同一份方法以节省内存;class语法中普通方法自动挂载到原型,而构造函数内定义方法会导致重复创建和无法继承。

在 JavaScript 中,通过原型对象(prototype)为构造函数或类添加方法,可以让所有实例共享这些功能,节省内存且便于维护。
给构造函数的 prototype 添加方法
传统构造函数通过 prototype 属性挂载公共方法,所有实例都能访问:
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
};
const p1 = new Person('Alice');
const p2 = new Person('Bob');
p1.sayHello(); // Hello, I am Alice
p2.sayHello(); // Hello, I am Bob
注意:方法中用 this 访问实例属性,且不能用箭头函数(会丢失 this 绑定)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
给内置类型原型扩展(谨慎使用)
可以向 Array、String、Number 等内置构造函数的 prototype 添加方法,但需避免命名冲突:
- 推荐加前缀,如 myUniqueMap 而非直接覆盖 map
- 先检查是否已存在,防止污染全局环境
- 团队项目中应统一规范,或优先使用工具库(如 Lodash)
if (!Array.prototype.myFirst) {
Array.prototype.myFirst = function() {
return this[0];
};
}
[10, 20, 30].myFirst(); // 10
ES6 类中的原型方法(更现代写法)
class 声明本质仍是基于原型,定义在 class 中的普通方法会自动添加到原型上:
class Animal {
constructor(name) {
this.name = name;
}
speak() { // 自动挂到 Animal.prototype
console.log(this.name + ' makes a sound.');
}
}
const dog = new Animal('Dog');
dog.speak(); // Dog makes a sound.
静态方法(static)则挂在类本身,不进原型链;而 getter/setter 和私有字段(#)不影响原型共享逻辑。
避免常见陷阱
- 不要直接赋值 prototype = {...},会切断 constructor 指针,建议用 Object.assign() 或逐个添加
- 扩展原型后,新创建的实例立即可用,但已存在的实例也立刻生效(原型是动态的)
- JSON 序列化时,原型方法不会被保存,只保留自有属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










