构造函数实现模块化组件基类,通过作用域隔离私有逻辑、原型共享通用方法、实例初始化独有状态;state/events/el均在构造函数中创建,避免共享引用;通用方法挂载原型,关键流程加保护;支持安全继承与钩子委托,并规避默认属性共享等常见陷阱。

用构造函数实现模块化组件的基类,核心是利用函数作用域隔离私有逻辑、通过原型共享通用方法、在实例上初始化独有状态——不依赖 class 语法,也能构建可继承、可复用、无副作用的组件骨架。
构造函数封装实例专属状态
每个组件实例必须拥有独立的状态和事件容器,不能共享引用类型数据。所有 this 上的属性(如 state、events、el)都应在构造函数中显式创建:
- 传入配置对象(如
{ el, data, methods }),并用Object.assign({}, defaults, options)合并默认值,避免修改原始对象 -
this.state = Object.assign({}, options.data || {})—— 每个实例拿到新对象,互不影响 -
this.events = new Map()或this.events = {}—— 不写在原型上,防止子类间事件监听互相覆盖
原型挂载可复用的通用方法
把所有子类共用的行为(如绑定/触发事件、更新视图、清理资源)放在原型上,节省内存且便于统一维护:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Component.prototype.on = function(type, handler) { ... }Component.prototype.emit = function(type, payload) { ... }Component.prototype.destroy = function() { this.offAll(); this.el?.remove(); }- 关键流程加保护:比如
if (typeof this.render === 'function') this.render(),避免子类没实现就报错
支持安全继承与钩子委托
子类通过 function SubComponent(options) { Component.call(this, options) } 显式调用父构造,并设置原型链;同时预留生命周期钩子供子类定制:
立即学习“Java免费学习笔记(深入)”;
- 子类原型需设为
Object.create(Component.prototype),再赋回constructor - 基类内部在关键节点调用
this.beforeMount?.()、this.mounted?.()等,子类只重写对应方法即可介入流程 - 若需在子类中调用父类同名逻辑(如扩展 mounted),可用
Component.prototype.mounted.call(this)
避免常见陷阱
手写构造函数基类时,几个容易忽略但影响稳定性的细节:
- 不在原型上写
defaultProps = {}或methods = []—— 这会导致所有实例共享同一数组或对象 - 不直接在子类里覆盖基类方法后丢弃原有逻辑,尤其 destroy、update 这类清理型方法
- 事件解绑必须在 destroy 中执行,且确保 this.events 是实例独有,否则卸载时可能误删其他组件监听器
- 挂载目标节点(
el)建议由基类统一接管,子类只负责提供 render 结果,保持职责分离

















