issubclass函数可不创建实例判断继承关系:先校验参数为函数,特殊处理object,再遍历childclass.prototype的原型链,严格比较是否包含parentclass.prototype。

不创建实例就能判断两个类是否存在继承关系,核心是检查子类的原型链是否包含父类的 prototype 对象。JavaScript 的继承本质是原型委托,不是“类到类”的静态关系,而是“子类.prototype → 父类.prototype”这条链路是否连通。
用 Object.getPrototypeOf() 遍历原型链
这是最直接、推荐的方式,无需实例,纯靠原型对象比较:
- 从
childClass.prototype开始,用Object.getPrototypeOf()逐级向上取原型 - 每一步都和
parentClass.prototype严格比较(===) - 匹配成功即存在继承;走到
null还没找到,说明无继承关系
写一个可靠的 isSubclass 判断函数
可封装成复用工具函数,兼顾健壮性和边界情况:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 先校验参数是否为函数(构造函数),排除非类输入
- 特殊处理
Object:所有自定义类都隐式继承自它,可直接返回true - 从
childClass.prototype的直接原型开始遍历,避免把自身当起点 - 循环中一旦发现
currentPrototype === parentClass.prototype,立即返回true
instanceof 不适合类间静态判断
虽然 a instanceof B 看似方便,但它依赖具体实例 a,且检测的是“实例的 [[Prototype]] 链上是否有 B.prototype”,不是“两个类定义之间是否存在继承结构”。
- 没实例就无法用,违背“不 new”的前提
- 即使有实例,它反映的是运行时状态,可能被动态修改(如篡改
__proto__) - 对抽象类关系的判断不够精确,容易误判(比如多个类共用同一 prototype)
注意区分:原型相同 ≠ 继承关系
有人误用 Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2) 来判断继承,这其实只说明两个对象共享同一个直接原型,不能推出类之间的父子关系。
- 例如两个独立构造函数的实例,若手动设置相同 prototype,会“伪相等”但无继承
- 继承关系必须是“子类.prototype 在父类.prototype 的上游”,是单向链路,不是双向相等
- 正确做法永远围绕
子类.prototype的原型链展开,而不是任意对象










