核心思路是用原型链统一管理共享方法、闭包封装私有状态,实现一次定义、多处复用、互不干扰:原型节省内存(万级实例省75%),闭包隔离实例数据,组合模式分离职责,关键在深拷贝默认配置、正确绑定/解绑事件、避免原型存实例数据。

核心思路是:用原型链统一管理共享方法,用闭包封装私有状态和配置,两者配合实现“一次定义、多处复用、互不干扰”。
用原型链集中定义可复用的方法
避免每个实例都创建一份相同逻辑。把通用行为(比如初始化、渲染、事件绑定)写在构造函数的 prototype 上,所有实例共享同一份函数引用。
- 例如:插件构造函数
MyPlugin的render()、destroy()都挂载在MyPlugin.prototype上,100 个实例调用的仍是同一个函数地址 - 测试数据表明,相比每个实例独立定义方法,原型方式在万级实例下可节省约 75% 内存
- 注意别让原型链过长——方法查找会逐级向上遍历,超过 5 层就可能影响性能;建议继承深度控制在 2~3 级以内
用闭包隔离每个实例的私有数据
构造函数内部用变量保存配置、状态、DOM 引用等,外部无法直接访问,既安全又避免全局污染。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 典型写法:
function MyPlugin(el, options) { const config = { ...defaultOptions, ...options }; const $el = typeof el === 'string' ? document.querySelector(el) : el; // 后续方法通过闭包访问 config 和 $el } - 这样每个插件实例都有自己的
config和$el,互不影响;即使同时运行多个同类插件,也不会错乱 - 闭包保留的变量不会被垃圾回收,直到该实例彻底销毁——所以记得在
destroy()中清理定时器、事件监听器等引用
组合模式:构造函数 + 原型 + 闭包返回接口
最终对外暴露的是一个干净、链式、可配置的 API,内部靠三者协作完成职责分离。
- 构造函数负责初始化私有上下文(闭包)
- 原型负责提供公共能力(复用性)
- 返回的对象或方法可进一步用闭包包裹,暴露有限接口,隐藏实现细节
- 示例:
return { init() { this.render(); return this; }, setOption(key, val) { config[key] = val; return this; } };—— 返回对象仍处于原始闭包作用域中,能读写私有变量
实际封装时的关键细节
不是堆砌概念,而是解决真实问题。
- 默认配置要深拷贝,防止多个实例共用同一份对象导致状态污染
- 事件监听必须绑定到当前实例的 DOM 节点,且销毁时解绑——闭包确保了节点引用不丢失
- 如果支持链式调用,每个方法最后都
return this;但注意this指向的是实例本身,它天然能访问原型方法和闭包变量 - 不要在原型上存实例相关数据(比如
this.data),那会变成所有实例共享——数据必须在构造函数作用域内声明
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










