extends 通过设置子类原型的 proto 指向父类原型建立原型链继承,使 instanceof 能沿链查找父类 prototype;该机制仅适用于 class,不适用于普通函数或箭头函数。

extends 通过建立原型链关系,让 instanceof 能沿着构造函数的 prototype 链向上查找,从而影响检测结果。
extends 建立了原型链继承关系
使用 class A extends B 时,JavaScript 会自动设置 A.prototype.__proto__ === B.prototype。这意味着从 A 构造出的实例,其原型链中会包含 B.prototype,因此 instanceof 在检查时能一路查到 B。
- 每个类都有自己的
prototype对象 -
extends把子类原型的__proto__指向父类原型 -
instanceof的原理就是:检查右操作数的prototype是否在左操作数的原型链上
instanceof 检测依赖原型链,而非构造函数名
instanceof 不看对象“是不是由某个类 new 出来的”,而是看它的 [[Prototype]] 链里有没有目标构造函数的 prototype。即使手动修改原型链,也能改变检测结果。
-
new Child() instanceof Parent返回true,因为Child.prototype继承自Parent.prototype - 如果删掉继承关系(比如重写
Child.prototype),instanceof就会返回false - 哪怕子类没调用
super(),只要原型链没断,instanceof依然有效
注意内置类和普通类的继承差异
继承内置类(如 Array、Error)时,extends 不仅设置原型链,还会确保实例具有正确的内部属性(如 [[ArrayLength]]),这会影响 instanceof 和其他行为的一致性。
-
class MyArray extends Array {}的实例既是MyArray也是Array实例 - 不通过
extends而是手动设置原型,通常无法正确继承内置类的内部机制 - 某些引擎对非标准继承的内置类实例,
instanceof Array可能返回false(取决于是否设置了正确的内部槽位)
箭头函数、普通函数不能用 extends,所以没有这种继承链
extends 是 class 语法的专属特性。普通函数或箭头函数无法作为父类被继承,也不能作为子类去继承别的类。它们没有 prototype 链式继承的语义支持,因此不会影响 instanceof 的行为。
-
function Foo() {}可以有prototype,但不能用extends继承它 - 想实现类似效果,得手动设置
Child.prototype = Object.create(Parent.prototype) - 手动继承后,
instanceof行为可以模拟,但缺少 class 语法的语义保证(如super、静态方法继承等)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











