前端框架源码深度依赖原型链:vue 2 通过增强原型上的 getter/setter 实现响应式;react 类组件方法和生命周期继承自 component.prototype;扩展原生原型或共享原型方法以复用逻辑、节省内存。

前端框架源码不是绕开原型链,而是深度依赖它来组织数据结构、复用逻辑、拦截行为。Vue 2 的响应式、React 类组件的生命周期、甚至现代状态库的实例方法共享,背后都是原型链在调度。
Vue 2 响应式系统靠重写原型上的 getter/setter 实现数据劫持
Vue 2 把 Object.prototype 上的访问器(getter/setter)作为切入点,用 Object.defineProperty 动态改写对象属性的定义。虽然不直接修改 Object.prototype(会污染全局),但它让每个响应式对象的 __proto__ 指向一个被增强过的原型对象——这个原型上挂载了统一的 get 和 set 行为。
- 当你访问
vm.message,实际触发的是该对象原型上定义的 getter,从而通知依赖更新 - 赋值
vm.message = 'hello'触发 setter,触发视图重渲染 - 所有响应式对象共享同一套原型逻辑,避免每个属性都单独绑定监听器
React 类组件的生命周期和方法来自 Component.prototype
你写的 class MyComponent extends React.Component,最终实例的 __proto__ 会指向 React.Component.prototype。这个原型上预置了 setState、forceUpdate、componentDidMount 等方法。
-
this.setState()不是写在每个组件实例上,而是在原型上统一实现 - 子类继承时,只需覆盖特定生命周期方法,其余行为自动沿原型链继承
- 即使你没显式调用
super(),React 内部也确保实例能通过原型链访问到基类能力
扩展内置对象(如 Array)是框架补全能力的常见手段
有些轻量框架或工具库会在启动时给 Array.prototype 或 Object.prototype 添加辅助方法,比如 Vue 2 的 arr.$set(虽然后来移除了,但思路一致)、Lodash 的混入方式,或自定义的 myFind、mapAsync。
- 所有数组实例立即获得新方法,无需改造已有代码
- this 在原型方法中自然指向调用它的数组实例,语义清晰
- 注意:现代框架更倾向用工具函数或 Proxy 替代直接扩展原生原型,但原理仍基于“查找路径可控”这一原型链特性
组件实例方法与 computed 的共享逻辑藏在原型链里
Vue 实例的 $data、$props、computed 属性,以及 methods 中定义的函数,并非全部挂在实例自身。很多是通过代理或 defineProperty 绑定在原型或内部观察者对象上,再由实例的 __proto__ 链接过去。
- 多个组件实例共用同一份
methods函数体,节省内存 - computed 的缓存逻辑封装在 getter 中,而 getter 被挂载在组件原型的访问器上
- 调试时打印
vm.__proto__,能看到大量框架注入的方法和访问器
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











