instanceof能自然识别多级继承关系,只要原型链完整连通;它沿[[prototype]]链逐级向上比对constructor.prototype,直至匹配或抵达null,如new c() instanceof a为true,前提是链路未断裂且避免跨iframe、原始值等限制。

instanceof 能自然识别多级继承关系,只要原型链完整连通,无需额外处理。
多级继承中 instanceof 的工作方式
它不看“层级深度”,只沿着对象的 [[Prototype]] 链逐级向上比对,直到找到匹配的 Constructor.prototype 或抵达 null。
- 例如:
class A {} → class B extends A {} → class C extends B {} -
const c = new C()的原型链是:C.prototype → B.prototype → A.prototype → Object.prototype → null - 因此:
c instanceof C、c instanceof B、c instanceof A、c instanceof Object全为true
关键前提是原型链不能断裂
ES6 class 继承自动维护链路,但手动改写原型时容易出错:
- 错误写法:
B.prototype = { method() {} }—— 这会切断B.prototype.__proto__与A.prototype的连接 - 正确写法:
B.prototype = Object.create(A.prototype),或使用class B extends A语法 - 也可用
Object.setPrototypeOf(B.prototype, A.prototype)修复已断链
实际判断建议
多数场景下直接用 instanceof 即可,但需注意边界:
- 对数组、正则等内置类型,优先用
Array.isArray()、RegExp.prototype.test等专用方法,更可靠 - 跨 iframe 时,不同上下文的
Array构造函数不相等,arr instanceof Array可能返回false,此时改用Object.prototype.toString.call(arr) === '[object Array]' - 原始值(如
42、'hello')无法用instanceof检测,它们没有原型链
调试原型链的小技巧
快速确认继承路径是否通畅:
- 打印原型链:
console.log(Object.getPrototypeOf(c)),再连续调用getPrototypeOf观察是否依次出现C.prototype、B.prototype、A.prototype - 验证引用相等:
Object.getPrototypeOf(c) === C.prototype、Object.getPrototypeOf(Object.getPrototypeOf(c)) === B.prototype - 避免依赖
__proto__(非标准),统一用Object.getPrototypeOf()











