原型继承模式不适用于构建跨端桥接层,bridge核心隔离层应基于协议而非继承,通过分层设计、运行时代理和协议标准化实现接口契约、生命周期管控与平台差异屏蔽。

原型继承模式本身不直接用于构建跨端桥接层,它是一种 JavaScript 的对象继承机制;而“Bridge 核心隔离层”本质是运行时通信抽象,关键在接口契约、生命周期管控与平台差异屏蔽——不是靠 prototype 链实现弹性,而是靠分层设计 + 运行时代理 + 协议标准化。
Bridge 层应基于协议而非继承关系组织
原生桥接的核心矛盾是 JS 侧与各端(iOS/Android/鸿蒙)能力不一致。强行用原型链模拟多端共用 API,会导致:方法缺失时静默失败、参数校验滞后、错误堆栈难追溯。更合理的方式是定义统一能力协议(如 Capability Schema),每个端实现该协议的适配器(Adapter),JS 侧只依赖协议接口,不感知具体原型链结构。
- 定义能力描述 JSON Schema(例如:
{"name": "camera.capture", "params": {"quality": "number"}, "returns": "base64"}) - 各端 Adapter 实现
invoke(method, params)和register(method, handler)两个基础契约 - JS 侧通过 Bridge 实例调用
bridge.invoke('camera.capture', { quality: 0.8 }),内部路由到对应 Adapter
用 Proxy + WeakMap 实现运行时动态桥接
避免在构造函数或原型上硬编码方法,改用 ES6 Proxy 拦截调用,结合 WeakMap 缓存实例级上下文,使桥接行为可热替换、可拦截、可审计。
- 创建 Bridge 实例时,用 Proxy 包裹空对象,所有方法调用都走
get(target, prop)拦截 - 拦截器内查注册表(Map
),若未注册则抛出结构化错误(含平台、方法名、建议修复路径) - WeakMap 存储每个 Bridge 实例的私有状态(如会话 ID、调试开关),不影响原型共享逻辑
隔离层需明确划分三类边界
高弹性来自职责分离,不是靠继承深度,而是把变化点切开:
- 通信边界:JS ↔ Native 使用消息队列 + 序列化(推荐 MessageChannel 或自定义二进制协议),禁用 eval、全局函数注入
-
能力边界:每个原生模块导出最小接口(如仅
readFile和writeFile),不暴露底层 SDK 类或实例 -
生命周期边界:Bridge 初始化/销毁由宿主容器(WebView/FlutterEngine)控制,JS 侧不可主动
new Bridge()多次
跨端一致性靠运行时校验,不是原型继承
不同端对同一能力的实现可能有细微差异(如 Android 返回 File URI,iOS 返回 base64)。与其让 JS 侧继承一个“通用 Camera 类”,不如在 Bridge 层做归一化转换:
- 注册端适配器时声明能力元信息(
supports: ['uri', 'base64', 'blob']) - JS 调用时指定期望格式(
bridge.invoke('storage.read', { path: 'x', format: 'blob' })) - Bridge 内部自动选择可用适配器,并做必要格式转换(如 base64 → Blob)











