object.getprototypeof 是构建类型适配器的核心工具,能绕过构造函数污染、跨 iframe 限制等陷阱,精准识别原生类型并支持安全的原型链匹配与边界输入防护。

Object.getPrototypeOf 是构建类型适配器的核心工具之一,它能绕过构造函数污染、跨 iframe 限制和 prototype 属性篡改等常见陷阱,提供稳定可靠的原型判定能力。
精准识别原生类型,不依赖 constructor
适配器常需区分数组、正则、日期等原生对象。用 Object.getPrototypeOf(obj) === Array.prototype 比 obj instanceof Array 更可靠,尤其在多窗口环境里——因为不同 iframe 中的 Array 构造函数是独立的,而 Array.prototype 在各上下文中是唯一的。
- 判断是否为原生正则:
Object.getPrototypeOf(obj) === RegExp.prototype - 确认是否为 Date 实例:
Object.getPrototypeOf(obj) === Date.prototype - 排除自定义类实例(如
class MyList extends Array):可组合使用Object.getPrototypeOf(obj) === Array.prototype和obj.constructor === Array
构建安全的原型链匹配策略
适配器有时需按继承层级提供不同处理逻辑。例如对“类数组对象”优先走 Array.prototype 方法,否则回退到通用迭代逻辑。这时可沿原型链逐级比对:
- 从
Object.getPrototypeOf(obj)开始,用===精确匹配目标原型 - 若不匹配,继续调用
Object.getPrototypeOf()向上查找,直到返回null - 避免使用
isPrototypeOf()做模糊匹配——它可能命中太深(如所有对象都含 Object.prototype),降低适配精度
封装可复用的适配检查函数
把原型判定逻辑封装成纯函数,便于组合与测试:
-
isPlainArray(obj):仅当Object.getPrototypeOf(obj) === Array.prototype时返回 true -
isNativeError(obj):检查是否直接继承自 Error.prototype、SyntaxError.prototype 等,而非用户自定义 Error 子类 -
getAdapterKey(obj):根据原型返回字符串键(如"array"、"date"、"map"),驱动后续 switch 分支或 Map 查找
规避原始值与边界输入风险
适配器常接收任意输入,需主动防御:
- 对
null或undefined先做守卫判断,避免 TypeError;可用obj != null && typeof obj === 'object'快速过滤 - 原始值(如字符串字面量)会被自动装箱,返回
String.prototype—— 若业务要求严格区分字面量与包装对象,应额外用Object(obj) !== obj判断是否为原始值 - 对
Object.create(null)创建的对象,Object.getPrototypeOf()返回null,可作为“无继承”类型的明确信号,用于跳过原型相关逻辑











