Object.getPrototypeOf 比 instanceof 和 constructor.name 更可靠,适用于跨执行上下文、constructor 被篡改或需精确匹配原型的场景;通过遍历原型链比对 prototype 实现类型判断,并可封装为高阶函数提升复用性与健壮性。
直接用 Object.getPrototypeOf 判断实例的原型链源头,比 instanceof 更可控、比 constructor.name 更可靠,特别适合处理跨执行上下文(如 iframe)、被篡改过 constructor 或需要精确匹配原型对象的场景。
Object.getPrototypeOf(obj) 返回对象的内部 [[Prototype]],也就是它的直接原型。只要这个原型是目标类的 prototype 对象(或其继承链上的某一级),就能确认类型归属。这绕过了 constructor 属性可能被覆盖、重写甚至删除的风险。
obj.constructor === MyClass —— 构造函数引用易被修改obj.constructor.name === 'MyClass' —— 名字可伪造,且不支持匿名类/闭包类Object.getPrototypeOf(obj) === MyClass.prototype
有些类型断言需要识别“是否为某类或其子类的实例”。这时不能只比对第一级原型,而要沿原型链向上查找,直到找到匹配项或到达 null。
Object.getPrototypeOf 向上遍历prototype
null 停止,返回 false
function isInstanceOf(obj, Class) { if (obj == null) return false; let proto = Object.getPrototypeOf(obj); while (proto !== null) { if (proto === Class.prototype) return true; proto = Object.getPrototypeOf(proto); } return false;}
在 iframe、Web Worker 或模块隔离环境中,同一个构造函数(如 Array)在不同上下文中是不同引用,instanceof 会失效。但 Object.getPrototypeOf 获取的是当前对象自身的原型,只要原型链中存在对应结构,仍可识别。
Array, Map, Date 等),可用 toString.call(obj) 辅助验证Symbol.toStringTag),再结合原型检查把核心逻辑封装为高阶函数,支持缓存、扩展和组合,提升健壮性和可读性。
prototype,避免重复访问isOneOf)null 和原始值提前返回 false,避免 getPrototypeOf 报错const createIsType = (Class, { strict = false } = {}) => { const targetProto = Class.prototype; return obj => { if (obj == null || typeof obj !== 'object') return false; let proto = Object.getPrototypeOf(obj); if (strict) return proto === targetProto; while (proto !== null) { if (proto === targetProto) return true; proto = Object.getPrototypeOf(proto); } return false; };};