基于原型链实现组件生命周期钩子,核心是基类定义空钩子方法和执行入口(如mount),子类通过原型继承覆盖同名方法;钩子调用依赖this指向和原型链查找,支持参数传递、异步处理及手动触发,无需注册或装饰器。

基于原型链实现组件生命周期钩子,核心是利用 JavaScript 原型继承机制,在基类中统一定义钩子调用逻辑,子类通过重写同名方法来响应生命周期阶段。这种方式轻量、不依赖框架,适合手写简易组件系统或理解 Vue/React 生命周期底层原理。
在基类中定义可触发的钩子方法
创建一个基类(如 Component),内部按顺序调用预设的钩子函数。关键不是“自动监听”,而是提供标准化的执行入口,比如 mount、unmount 等方法:
- 每个生命周期方法(如 beforeMount、mounted)在基类中声明为空函数,便于子类覆盖
- mount() 内部依次检查并调用 this.beforeMount() → 渲染 → this.mounted()
- 确保所有钩子都用 this 调用,这样实际运行时会沿原型链查找子类实现
子类通过原型链继承并实现具体逻辑
子类不需额外注册钩子,只需在自身原型上定义同名方法即可。由于 JavaScript 方法调用遵循原型链查找规则,基类中的 this.xxx() 自动命中子类版本:
- 使用 class extends Component 或 Child.prototype = Object.create(Component.prototype) 继承
- 直接写 mounted() { console.log('已挂载'); },无需修饰符或装饰器
- 若子类未实现某个钩子(如没写 beforeUnmount),基类的空实现会静默执行,不影响流程
支持钩子参数与上下文控制
为了让钩子更实用,基类调用时应传递必要信息,并确保 this 指向当前实例:
- 在 mount(el) 中把容器节点 el 作为参数传给 this.mounted(el)
- 避免在钩子中直接修改原型上的共享状态,所有数据操作都基于实例属性(this.data、this.el)
- 如需异步钩子(如 async mounted()),基类 mount 方法需用 await 调用,否则会跳过等待
手动触发与组合式扩展
原型链方案天然支持手动调用和条件触发,也容易叠加新钩子:
- 可在任意时机调用 this.update(),并在其中插入 this.beforeUpdate() 和 this.updated()
- 新增钩子(如 beforeDestroy)只需在基类添加调用点,子类实现即生效,无需修改继承体系
- 配合 Object.assign(this, options) 初始化时合并配置,让钩子能访问初始化参数

















