reflect 本身不能获取对象的实例类型,它不提供类型检测或构造函数识别功能;应使用 constructor.name、object.prototype.tostring.call() 或 instanceof 等原生机制进行运行时类型检查。

Reflect 本身不能获取对象的实例类型。
这是个常见误解:`Reflect` 是 ES6 提供的一组静态方法,用于更规范、更函数式地操作对象(如 Reflect.get、Reflect.set、Reflect.construct 等),但它**不提供类型检测或构造函数识别功能**。获取“实例类型”,本质是判断对象是由哪个构造函数创建的,这属于运行时类型检查范畴,需用其他原生机制。
用 constructor 获取构造函数名
最直接的方式是访问对象的 constructor 属性:
- 它指向创建该实例的构造函数(对于普通对象、类实例、内置类型如
Date、Array都有效); - 可通过
obj.constructor.name获取构造函数名字符串; - 注意:如果原型链被修改(如手动覆盖
constructor或使用Object.create(null)),结果可能不准。
示例:
class Person {}
const p = new Person();
console.log(p.constructor.name); // "Person"
const arr = [1, 2];
console.log(arr.constructor.name); // "Array"
const d = new Date();
console.log(d.constructor.name); // "Date"
用 Object.prototype.toString.call 更可靠地识别内置类型
当需要区分内置对象(如 Array、Map、Set、RegExp)且担心 constructor 被篡改时,推荐用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Object.prototype.toString.call(obj)—— 返回形如"[object Array]"的字符串; - 它不受原型链改动影响,是 JS 中最稳健的内置类型识别方式;
- 对自定义类实例,仍返回
"[object Object]",所以适合判别内置类型,不适用于自定义类名。
示例:
console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call(new Map())); // "[object Map]"
console.log(Object.prototype.toString.call({})); // "[object Object]"
console.log(Object.prototype.toString.call(new Person())); // "[object Object]"
结合 instanceof 判断是否为某类实例
若已知目标构造函数(如 Person、Array),可用 instanceof 检查原型链上是否存在该构造函数的 prototype:
- 适用于自定义类和内置构造函数;
- 依赖原型链完整,对跨 iframe 对象可能失效(因不同全局环境的 Array 构造函数不等价);
- 不能直接得到类型名字符串,但可用于逻辑分支判断。
示例:
const p = new Person(); console.log(p instanceof Person); // true console.log(p instanceof Array); // false console.log([] instanceof Array); // true
没有 Reflect.getType 或类似 API
目前(ES2024)JavaScript 标准中不存在 Reflect.getType()、Reflect.instanceType() 或任何以 Reflect. 开头的类型查询方法。所有类型相关操作都需组合使用 constructor、instanceof、Object.prototype.toString 或 typeof(后者仅对原始值有效)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










