安全判定深层原型包含关系需确保调用合法、参数有效,isPrototypeOf检查整个原型链;必须由潜在原型对象调用并传入目标对象,顺序不可颠倒,且需校验参数非null和object类型。

要安全判定深层原型包含关系,核心是确保调用合法、参数有效,并理解 isPrototypeOf 检查的是整个原型链(不止直接原型),而非仅某一层。
明确调用主体和参数角色
isPrototypeOf 必须由「潜在的原型对象」调用,传入「待检测的目标对象」。顺序不能颠倒:
- ✅ 正确:
Array.prototype.isPrototypeOf([1, 2])—— 查 Array.prototype 是否在数组的原型链中 - ❌ 错误:
[1, 2].isPrototypeOf(Array.prototype)—— 实例不能当调用者,且语义反了 - ⚠️ 注意:
Object.create(null)创建的对象没有原型链,任何.isPrototypeOf()都返回 false
提前校验参数有效性
原始值(如字符串字面量 "abc")、null、undefined 无法作为参数,否则会报错或返回 false:
- 对目标对象做防护:
obj != null && typeof obj === 'object' - 对原型侧也检查:
protoObj != null && typeof protoObj === 'object' - 避免直接写
String.prototype.isPrototypeOf("hello")—— 字符串字面量不是对象;可改用String.prototype.isPrototypeOf(new String("hello"))
应对多层继承与自定义原型链
该方法天然支持深层判断,只要原型对象真实存在于目标对象的整条 [[Prototype]] 链上即可:
- 例如:
Animal.prototype.isPrototypeOf(dog)返回 true,即使dog.__proto__ === Dog.prototype,而Dog.prototype.__proto__ === Animal.prototype - 若用
Object.create(parent)构建链,可直接用parent.isPrototypeOf(child),无需依赖构造函数 - 不依赖
constructor或instanceof,因此跨 iframe 时仍可靠(只要原型对象能被访问)
替代方案:手动遍历用于调试或定位层级
当需要确认具体在哪一层匹配,或想规避 isPrototypeOf 的隐式行为时,可用 Object.getPrototypeOf() 循环检查:
- 从目标对象开始:
let p = obj - 循环向上:
while (p = Object.getPrototypeOf(p)) { if (p === targetProto) return true; } - 退出条件是
p变为null,说明已到原型链顶端仍未找到

















