JavaScript中无类型断言,运行时可用instanceof或isPrototypeOf判断原型链关系:instanceof检查构造函数原型,isPrototypeOf直接验证原型对象是否存在;避免用constructor判断,因其不可靠;需查直接原型时用Object.getPrototypeOf。

JavaScript 中没有“类型断言”这个概念——那是 TypeScript 的语法。原生 JavaScript 无法在编译期做类型断言,但你可以通过运行时检查来判断一个对象是否属于某个原型对象,也就是确认它是否“是某类的实例”或“原型链中包含某原型”。核心方法就两个:用 instanceof 或 isPrototypeOf()。
用 instanceof 判断构造函数关系
这是最常用、语义最清晰的方式,适合你已知构造函数(如 Array、Date、MyClass)的场景:
-
obj instanceof Constructor返回true,说明obj的原型链中存在Constructor.prototype - 右侧必须是函数(有
prototype属性),否则会报错 - 支持继承链:数组既是
Array实例,也是Object实例
例如:
const arr = [1, 2];<br>arr instanceof Array; // true<br>arr instanceof Object; // true<br>arr instanceof RegExp; // false
立即学习“Java免费学习笔记(深入)”;
用 isPrototypeOf 直接检查原型存在性
当你手头是一个具体的原型对象(比如 Array.prototype 或自定义的 parent),想确认它是否在目标对象的原型链上,就用这个:
-
prototypeObj.isPrototypeOf(obj)—— 更底层、更灵活 - 右侧可以是任意对象,不要求是函数;甚至可以是
Object.create({})创建的普通对象 - 适合手动构建原型链或检测内置原型的精确位置
例如:
const arr = [1, 2];<br>Array.prototype.isPrototypeOf(arr); // true<br>Object.prototype.isPrototypeOf(arr); // true<br><br>const parent = {};<br>const child = Object.create(parent);<br>parent.isPrototypeOf(child); // true
别用 constructor 做类型判断
obj.constructor === SomeClass 看似直观,但不可靠:
-
constructor属性可被随意改写(Child.prototype.constructor = Parent) - ES6
class或箭头函数等场景下容易丢失或指向不一致 - 原型链上可能有多个
constructor,语义模糊
补充:只想检查直接原型怎么办
如果只关心对象的直接原型(不是整条链),而不是“是否属于某类”,那就用:
Object.getPrototypeOf(obj) === SomePrototype- 或者
obj.__proto__ === SomePrototype(不推荐,__proto__是非标准但广泛支持的属性)
例如:Object.getPrototypeOf([1,2]) === Array.prototype 是 true;但 Object.getPrototypeOf({}) === Object.prototype 才是 true,而 Object.getPrototypeOf({}) === Array.prototype 就是 false。


















