object.getprototypeof 可安全判断对象类型:通过比对原型链顶端的内置原型(如 array.prototype)避开跨上下文和 constructor 篡改问题;需前置校验 null 和对象类型,并结合 tostring.call 兜底;封装的工具函数适用于沙箱等场景。

直接用 Object.getPrototypeOf 检查对象类型,核心在于比对原型链顶端的构造函数或内置原型对象,避开 instanceof 在跨执行上下文(如 iframe)中失效的问题,也规避了手动读取 constructor 属性可能被篡改的风险。
用 Object.getPrototypeOf 获取原型并比对内置构造器原型
每个标准内置对象(如数组、日期、正则)都有唯一的原型对象,可通过 Array.prototype、Date.prototype 等直接引用。使用 Object.getPrototypeOf(obj) === Array.prototype 可精准判断是否为原生数组,不依赖 obj.constructor 或 instanceof。
-
Object.getPrototypeOf([]) === Array.prototype→ true -
Object.getPrototypeOf(new Date()) === Date.prototype→ true -
Object.getPrototypeOf(/a/) === RegExp.prototype→ true
处理 null 和普通对象的边界情况
Object.getPrototypeOf(null) 会抛错,需先用 obj !== null && typeof obj === 'object' 做前置校验;对普通对象(字面量或 Object.create(null) 创建的),其原型可能是 Object.prototype 或 null,应单独判断:
- 若
Object.getPrototypeOf(obj) === Object.prototype,说明是普通对象(非 null 原型) - 若
Object.getPrototypeOf(obj) === null,说明是Object.create(null)创建的对象 - 建议配合
Object.prototype.toString.call(obj)作为兜底,获取规范类型标签(如[object Array])
封装可复用的安全类型判断函数
可基于原型比对封装一组工具函数,避免重复写冗长表达式:
isArray(obj) { return Object.getPrototypeOf(obj) === Array.prototype; }isDate(obj) { return Object.getPrototypeOf(obj) === Date.prototype; }isPlainObject(obj) { return obj !== null && typeof obj === 'object' && Object.getPrototypeOf(obj) === Object.prototype; }
这类函数不依赖全局环境,也不受 constructor 属性污染影响,适合在沙箱、微前端或多 iframe 场景中使用。
注意不可扩展对象与代理对象的限制
Object.getPrototypeOf 对不可扩展对象、密封对象、冻结对象均有效,但对 Proxy 对象默认返回其 target 的原型——除非显式重写了 getPrototypeOf trap。若需检查 Proxy 类型,应先用 obj instanceof Proxy 判断,再决定是否穿透获取目标原型。











