原型链无法跨 iframe 传递,因各 iframe 具有独立全局环境和构造函数;同域亦不例外,instanceof 必然失效;可行方案是发送带 $type 标记的纯数据,接收方按需重建实例或用 Proxy 模拟行为。

原型链本身不能跨 iframe 传递,因为每个 iframe 拥有独立的全局执行环境,包括独立的 Object、Array、Date 等内置构造函数,以及完全隔离的原型对象。这意味着:同一个构造函数在不同 iframe 中是不同的函数对象,它们的 prototype 不共享,实例的 [[Prototype]] 链天然断裂。
同域 iframe 也无法自动延续原型链
即使两个 iframe 同源(比如都来自 https://a.com),它们的 window 对象仍是分离的:
iframe1.contentWindow.Array !== iframe2.contentWindow.Array-
arr instanceof parent.Array在子 iframe 中永远为false,哪怕arr是父页面传来的数组 - 用
postMessage传递的对象会经过结构化克隆(structured clone),只保留可序列化数据,所有原型信息、方法、私有属性全部丢失
跨 iframe 保持“类关系”的可行思路
所谓“保持关系”,实际是指让接收方能识别出对象“本应属于某类”并按该类逻辑处理。这不是还原原型链,而是约定 + 元信息 + 手动重建:
- 发送前加类型标记:把
{ $type: 'User', name: '张三', id: 123 }这样的纯数据对象发过去,不传实例 - 接收方按
$type字段匹配本地构造函数,再用new User(data)或工厂函数重建实例 - 若需复用方法,可将通用逻辑抽成独立模块(如 UMD 或 ES 模块),由双方各自加载,避免依赖跨上下文的原型继承
instanceof 在跨 iframe 场景下必然失效
这是设计使然,不是 bug:
-
obj instanceof ParentWindow.MyClass会报错或返回false,因为ParentWindow.MyClass在子 iframe 中不可访问 - 即便同域,
ChildWindow.MyClass.prototype.isPrototypeOf(obj)也无效,因obj的[[Prototype]]指向的是子 iframe 的MyClass.prototype(如果它存在) - 唯一可靠的判断方式是检查对象结构或
$type字段,而非运行时原型链
替代方案:用 Proxy 或自定义 descriptor 模拟行为
如果必须在接收端“表现得像原类实例”,可在收到数据后手动包装:
- 用
Proxy拦截读取,对name、toString等字段做映射 - 或定义一个轻量 wrapper 类,把原始数据作为私有字段,对外暴露一致接口
- 注意:这仍是模拟,不是真正的原型继承,
instanceof和isPrototypeOf依然不成立











