优雅封装原型式继承的核心是不修改原生原型、避免全局污染,采用组合代理与配置拦截,通过封装类(如SmartArray)或静态工具类实现可复用、易维护的增强逻辑。

优雅封装原型式继承的 API,核心不是“改原型”,而是“不碰原生、不污染全局、可复用、易维护”。重点在于用组合代替继承,用代理代替扩展,用配置和拦截统一逻辑。
避免直接修改内置原型
不要给 Array.prototype、String.prototype 或 Date.prototype 直接添加方法。这会导致:
- 与其他库或 polyfill 冲突(比如某个 UI 库也加了同名方法)
- ECMAScript 规范禁止修改某些不可配置属性,可能在严格模式下报错
- 团队协作时难以追踪行为来源,调试成本高
推荐用封装类代理原生实例
创建一个新类(如 SmartArray),内部持有原生数组,对外提供增强方法,但不改变 Array 本身:
- 构造时接收原生数组或初始化参数:
new SmartArray([1,2,3]) - 所有方法都基于内部
this.data操作,返回新实例或原始值 - 支持链式调用:
smartArr.filter(...).map(...).toArray() - 必要时暴露原始数组:
smartArr.raw()或smartArr.valueOf()
用静态工具类替代实例方法扩展
如果只是想复用逻辑,更轻量的方式是静态工具类:
- 定义 ArrayUtils、ObjectUtils 等纯函数集合
- 方法接收原生对象为第一参数,保持无副作用:
ArrayUtils.chunk(arr, size) - 配合 TypeScript 接口,类型提示清晰,IDE 支持好
- 按需导入,tree-shaking 友好,不增加运行时体积
结合请求层做统一能力注入
在 Vue 或小程序中,“原型式”的优雅体现常是挂载到实例上下文,而非 JavaScript 原型链:
- Vue 2:
Vue.prototype.$api = apiClient,组件内直接用this.$api.get(...) - Vue 3(setup):
app.config.globalProperties.$api或通过 provide/inject - 小程序:
App.prototype.request = requestWrapper,页面中用getApp().request(...) - 关键点:挂载的是封装后的实例或函数,不是裸 fetch 或 axios,已含拦截、重试、错误格式化等能力
不复杂但容易忽略——真正的优雅,不在语法多炫,而在边界清晰、职责分明、改一处而不动全局。


















