可利用object.create构建惰性委托链,通过proxy拦截方法访问并动态加载模块,首次调用时执行import()等异步操作,挂载方法到分层原型链,后续复用缓存结果。

可以利用 Object.create 构建惰性委托链,让方法在首次调用时才加载并绑定到原型,后续复用缓存结果。核心在于延迟初始化原型对象,并通过代理(或 getter)触发加载逻辑。
设计一个可延迟挂载的原型工厂
不直接把所有方法写死在原型上,而是定义一个“原型生成器”,它返回一个带 load 方法的对象,该方法只在首次访问时执行异步/动态加载(如 import()、AJAX 或模块注册),然后缓存并替换当前原型。
- 用
Object.create(null)创建干净基础对象,避免污染内置原型 - 在实例上保留一个私有属性(如
__protoLoader)指向加载器函数 - 重写
getPrototypeOf行为(需配合 Proxy)或更实用的方式:在方法访问时按需补全原型链
用 Proxy 拦截方法访问并触发加载
对实例对象做一层 Proxy,当读取某个方法属性且该属性不存在时,触发加载逻辑,将方法注入到其原型中,再返回该方法。
- Proxy 的
get拦截器判断目标对象无该属性,且其原型(Object.getPrototypeOf(target))也未提供,则调用loadMethod('xxx') -
loadMethod内部可动态import('./utils.js').then(m => {...}),然后把方法挂到原型上(用Object.setPrototypeOf或更安全地——先Object.create新原型并继承旧原型) - 注意:不能频繁调用
setPrototypeOf,推荐一次性构建完整原型后替换
构建分层原型链实现“按需升级”
初始实例基于一个极简原型(仅含 load 和 hasMethod),随着方法被调用,逐步用 Object.create 扩展出更丰富的原型层级。
- 例如:
const base = Object.create(null); const utilsProto = Object.create(base); const apiProto = Object.create(utilsProto); - 首次调用
obj.fetchData→ 加载 API 模块 → 创建apiProto并设为 obj 新原型 → 后续调用直接命中 - 每个子原型都通过
Object.create显式继承前一级,确保方法查找路径可控、可预测
封装成可复用的构造器工具函数
把上述逻辑收敛为一个工厂函数,接受加载策略和方法映射表,返回可实例化的类或创建函数。
- 示例签名:
const LazyClass = createLazyClass({ fetch: () => import('./api.js'), validate: () => import('./validator.js') }); - 内部:每个实例初始化时用
Object.create(lazyBaseProto),lazyBaseProto包含通用拦截逻辑 - 方法调用时自动 resolve 对应模块,提取导出函数,挂到实例专属原型(或共享子原型)上










