应将共享方法统一挂载到原型对象而非实例上,优先使用prototype定义方法;用object.create实现安全的原型继承;批量添加方法时用object.assign;谨慎扩展原生原型,推荐封装为工具函数或挂载到自定义基类。

把共享方法统一挂到原型对象上,而不是每个实例都重复创建。
优先使用 prototype 定义方法
构造函数只负责初始化实例独有的属性(如 name、id),所有可复用的方法(如 save、validate、toJson)都定义在 Constructor.prototype 上。这样无论创建 10 个还是 10000 个实例,这些方法在内存中只存一份。
- ✅ 正确写法:
Person.prototype.getName = function() { return this.name; }; - ❌ 避免写法:
this.getName = function() { ... }放在构造函数内部——会导致每个实例都拷贝一份函数
用 Object.create 实现干净的原型继承
当需要多层类结构(比如 User 继承 Entity),不要直接用 new Parent() 赋值给子类 prototype,否则会意外共享父类实例状态。改用 Object.create(Parent.prototype),再手动补上 constructor 指向:
User.prototype = Object.create(Entity.prototype);User.prototype.constructor = User;- 之后再往
User.prototype添加专属方法,不会污染父类或影响其他子类
批量添加方法时用 Object.assign
维护大量方法时,避免逐行写 Class.prototype.method1 = ...。可集中定义一个方法对象,一次性合并:
Object.assign(User.prototype, {login() { ... },logout() { ... },updateProfile() { ... }});
语义清晰,便于分组管理,也方便后续抽离成 mixin 模块。
谨慎扩展原生原型,但可封装工具方法
不要直接修改 Object.prototype 或 Array.prototype(易引发冲突)。若确实需要通用能力(如 deepClone、isPlainObject),建议:
- 封装为独立工具函数,按需导入
- 或挂到自定义基类(如
BaseModel.prototype)上,由业务类显式继承 - 避免“全局污染”,保障可预测性和协作安全











