写在原型上更省内存,因为方法只定义一次,所有实例共享同一函数对象;而构造函数内定义会使每个实例都创建独立函数副本,造成冗余。

构造函数把方法写在原型上,是为了让所有实例共享同一份方法代码,避免每个实例都单独创建一份函数对象,从而节省内存。
为什么写在原型上更省内存
如果在构造函数内部用 this.method = function() {...} 定义方法,每次 new 一个实例,就会创建一个全新的函数对象。100 个实例就产生 100 个相同逻辑的函数副本,浪费内存。
而写在原型(Constructor.prototype.method = function() {...})上,方法只定义一次,所有实例通过原型链访问同一个函数,真正实现复用。
正确写法:方法挂到 prototype 上
推荐在构造函数外部统一设置原型方法:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 Person.prototype.sayName = function() { console.log(this.name); };
- 或批量赋值:Object.assign(Person.prototype, { sayName() {}, walk() {} });
- ES6 可用类语法(本质仍是原型):class Person { sayName() { ... } },方法自动挂载到原型
注意别踩的坑
不要在构造函数里重新给 prototype 赋值(如 this.constructor.prototype.xxx = ...),这既低效又容易出错;也不要在实例上直接改原型(影响所有实例)。
还要确保 this 指向正确——原型方法里的 this 默认指向调用它的实例,无需额外绑定(除非你手动用 call/apply 或箭头函数破坏了它)。
怎么验证是否真的共享了方法
可以简单测试:
- new Person('a') === new Person('b') → false(实例不同)
- new Person('a').sayName === new Person('b').sayName → true(方法引用相同)
结果为 true 就说明是同一函数对象,内存被有效复用。

















