返回

JavaScript 对象类型名称大揭秘:教你 get 出对象的真身

javascript

获取 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 中,类是值类型还是引用类型?

类是引用类型,这意味着它们存储在堆中,并且可以通过引用访问。