应将方法统一挂载到原型上而非构造函数内,以节省内存;批量添加推荐 Object.assign;避免污染原生原型;重写 prototype 后需手动修复 constructor 指向。

把方法统一挂到原型上,而不是放在构造函数里创建实例时再定义。
方法必须定义在 prototype 上
构造函数只负责初始化实例独有的数据(比如 name、id),所有可复用的行为(如 save、validate、toString)都应该写在 Constructor.prototype 上。这样无论创建多少个实例,方法在内存中只存一份。
- ✅ 正确:
Person.prototype.getName = function() { return this.name; }; - ❌ 错误:
this.getName = function() { return this.name; };写在构造函数内部 —— 每个实例都会生成独立函数,浪费内存且===判断为 false
批量添加方法更清晰可控
当方法较多时,逐行写 Constructor.prototype.xxx = 容易出错且难维护。推荐用 Object.assign 集中管理:
- 定义一个方法对象,例如:
const personMethods = { getName() { ... }, getAge() { ... } }; - 一次性挂载:
Object.assign(Person.prototype, personMethods); - 语义明确,便于分组、复用,也方便后续抽成 mixin
避免污染原生原型,但可封装通用能力
不要直接修改 Array.prototype 或 Object.prototype,容易引发冲突。如果需要通用工具方法(如 deepClone、isPlainObject):
立即学习“Java免费学习笔记(深入)”;
- 封装成独立函数,按需调用
- 或挂载到自定义基类的 prototype 上,由业务类继承
- 不侵入全局,不影响第三方库行为
注意 constructor 指向别丢失
如果重写了整个 prototype(比如用 Object.create(Parent.prototype) 实现继承),记得手动补回 constructor:
Child.prototype = Object.create(Parent.prototype);Child.prototype.constructor = Child;- 否则
instance.constructor可能指向父类甚至Object,影响类型识别和调试


















