如何在 JavaScript 中获取对象的类名

在 JavaScript 中获取对象的类名

How to get the Class Name of an Object in JavaScript

访问name对象的构造函数上的属性以获取对象的类名,例如obj.constructor.name.

constructor属性返回对创建实例对象的构造函数的引用。

索引.js
class Person {} const p1 = new Person(); console.log(p1.constructor.name); // 👉️ Person console.log(Person.name); // 👉️ Person

我们访问了Object.constructorname属性上的属性

Object.constructor属性返回对创建对象的构造函数的引用。

索引.js
class Person {} const p1 = new Person(); // ✅ The function (class) that created the object console.log(p1.constructor); // 👉️ [class Person] // ✅ The class name of the object (string) console.log(p1.constructor.name); // 👉️ "Person"

通过在类上创建方法来获取对象的类名

另一种方法是在类上创建一个方法来获取对象的类名。

索引.js
class Person { getClassName() { return this.constructor.name; } } const p1 = new Person(); const className = p1.getClassName(); console.log(className); // 👉️ Person

如果您需要Object.constructor.name经常访问该属性,请创建一个隐藏它的方法。

所有对象(使用创建的对象除外Object.create(null))都具有构造函数属性。

在没有构造函数的情况下创建的对象具有指向Object特定类型的主构造函数的构造函数属性。

索引.js
console.log({}.constructor.name); // 👉️ Object console.log([].constructor.name); // 👉️ Array

name直接在类上访问属性

您还可以直接在类上访问name属性以获取其名称作为字符串。

索引.js
class Person {} console.log(Person.name); // 👉️ Person

检查对象是否是使用特定类创建的

您可以通过多种方式检查对象是否是使用特定类创建的。

obj.constructor.name === Person.name当您缩小生产代码时,应该首选该选项。

索引.js
class Person {} const p1 = new Person(); if (p1.constructor.name === 'Person') { // 👇️ this runs console.log("The object's constructor is Person"); } // -------------------------------------------------- // ✅ If you minify your code for production, do this if (p1.constructor.name === Person.name) { // 👇️ this runs console.log("The object's constructor is Person"); }

第一个if语句访问该constructor.name属性以获取对象的类名并将其与字符串“Person”进行比较。

索引.js
class Person {} const p1 = new Person(); if (p1.constructor.name === 'Person') { // 👇️ this runs console.log("The object's constructor is Person"); }

这在大多数情况下都有效,但是,如果可能的话,最好将对象的类名与Person.name.

索引.js
class Person {} const p1 = new Person(); // ✅ If you minify your code for production, do this if (p1.constructor.name === Person.name) { // 👇️ this runs console.log("The object's constructor is Person"); }

如果您缩小生产代码,类的名称可能会改变。name当您在比较中访问类的属性时,这不是问题。

通过定义静态方法获取对象的类名

您还可以定义一个static可以直接在类上访问的方法,以获取对象的类名。

索引.js
class Person { static getClassName() { return 'Person'; } getClassName() { return Person.getClassName(); } } const p1 = new Person(); const className = p1.getClassName(); console.log(className); // 👉️ Person console.log(Person.getClassName()); // 👉️ Person

关键字static定义静态方法或字段。静态方法不能在类的实例上直接访问,必须在类本身上访问。

我们的静态方法返回字符串Person,我们的实例方法调用静态方法返回相同的值。

如果需要在运行时检查对象是否是类的实例,请使用
instanceof运算符。

索引.js
class Person {} const p1 = new Person(); class Animal {} console.log(p1 instanceof Person); // 👉️ true console.log(p1 instanceof Animal); // 👉️ false

如果构造函数的属性出现在对象的原型链中,则instanceof返回,否则
返回
trueprototypefalse

# 额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: