JavaScript 对象类型名称大揭秘:教你 get 出对象的真身
2024-03-27 00:11:08
获取 JavaScript 对象类型名称:你的 class.getName()
问题:
在 Java 中,我们可以使用 class.getName()
方法获取对象的类型名称。然而,在 JavaScript 中,我们如何实现这一功能呢?
解决方法:
JavaScript 提供了多种方法来获取对象的类型名称:
1. 使用 Object.prototype.toString()
Object.prototype.toString()
方法返回一个字符串,该字符串表示对象的类型。对于用户定义的类,它将采用 "[object ClassName]"
的形式,其中 ClassName
是类的名称。
class MyClass {
// ...
}
const obj = new MyClass();
console.log(Object.prototype.toString.call(obj)); // "[object MyClass]"
2. 使用 constructor.name
constructor.name
属性返回类的名称,前提是该类是使用 class
定义的。
class MyClass {
// ...
}
const obj = new MyClass();
console.log(obj.constructor.name); // "MyClass"
3. 使用 typeof
运算符(不推荐)
typeof
运算符返回一个字符串,表示对象的类型。对于一个类实例,它将返回 'object'
。但是,它不适用于基本类型,并且在处理继承关系时可能会产生误导性结果。
class MyClass {
// ...
}
const obj = new MyClass();
console.log(typeof obj); // "object"
推荐方法:
对于一般用途,我们推荐使用 constructor.name
方法,因为它简洁且明确。但是,对于某些情况,例如处理匿名类或使用 Object.create()
创建的对象,我们可能需要使用 Object.prototype.toString()
。
辅助函数
为了获得更简洁和一致的体验,我们可以创建一个辅助函数来封装这些方法:
function getTypeName(obj) {
if (obj === null) {
return "null";
}
if (obj === undefined) {
return "undefined";
}
if (typeof obj === "object") {
if (obj.constructor) {
return obj.constructor.name;
}
return Object.prototype.toString.call(obj).slice(8, -1);
}
return typeof obj;
}
const obj = new MyClass();
console.log(getTypeName(obj)); // "MyClass"
常见问题解答:
1. 为什么不推荐使用 typeof
运算符?
typeof
运算符不适用于基本类型,并且在处理继承关系时可能会产生误导性结果。
2. 什么时候应该使用 Object.prototype.toString()
?
当我们处理匿名类或使用 Object.create()
创建的对象时,应该使用 Object.prototype.toString()
。
3. 辅助函数 getTypeName
的好处是什么?
辅助函数提供了获取对象类型名称的一致和简洁的方式,减少了代码冗余。
4. 如何获取父类的名称?
要获取父类的名称,我们可以使用 Object.getPrototypeOf(obj).constructor.name
。
5. 在 JavaScript 中,类是值类型还是引用类型?
类是引用类型,这意味着它们存储在堆中,并且可以通过引用访问。