javascript - 获取对象的构造函数名称

标签 javascript class ecmascript-6

如何获取对象类的名称?我在这个例子中的意思是“进程”enter image description here

我看到了两种获取它的方法。第一个是在这个类中写一个 getter,比如

 getClassName(){return "Process"}

但是我想如果我试图在不属于这个类并且没有这样的方法的对象中调用这个方法会出错。

第二个是使用object instanceof Process。但也许有一些方法可以让它变得更好更正确?

最佳答案

您可以从 constructor 上的 name 获取它:

console.log(object.constructor.name);

例如,当您执行 ex = new Example 时,在使 Example.prototype 成为所创建对象的原型(prototype)的正常过程中(ex),并且该对象从该对象继承一个 constructor 属性,该属性引用回构造函数 (Example)。

我说“在正常情况下”是因为可以通过多种方式改变这些正常关系。例如,代码可以用对象的自有属性 (ex.constructor = somethingElse;) 覆盖 constructor 属性。要排除该特定情况,您可以使用:

console.log(Object.getPrototypeOf(object).constructor.name);

实例:

class Example1 {
}
const e1 = new Example1();
console.log(e1.constructor.name); // "Example1"

class Example2 {
    constructor() {
        this.constructor = "I'm special";
    }
}
const e2 = new Example2();
console.log(Object.getPrototypeOf(e2).constructor.name); // "Example2"

指定 JavaScript 的 TC39 委员会成员很高兴在构建 then 的新 promise 时在 Promise 中使用实例的 constructor 属性和 catch 返回(参见第 3 步 here,其中 here 并从实例中读取 constructor)(以及其他一些地方),因此您不会如果您也使用它,请自行解决。他们甚至不去查看实例的原型(prototype)。

但是,是的,只是为了完整起见,即使你去找它的原型(prototype),它仍然有可能让你误入歧途,因为原型(prototype)的 constructor 属性也可以被混为一谈:

class Example {
}
Example.prototype.constructor = Object; // Why would anyone do this? People are weird.
const e = new Example();
console.log(Object.getPrototypeOf(e).constructor.name); // "Object"

也可以在函数上重新定义name:

class Example {
}
// Why would someone do this? People are weird.
Object.defineProperty(Example, "name", {
    value: "flibberdeegibbit"
});
const e = new Example();
console.log(Object.getPrototypeOf(e).constructor.name); // "flibberdeegibbit"

所以...警告用户。


请注意,函数 name 属性是 ES2015 的新属性(class 语法也是如此)。如果您通过转译器使用 class 语法,它可能会也可能不会正确设置 name

关于javascript - 获取对象的构造函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46217853/

相关文章:

c++ - 如何为类变量实现虚函数覆盖

javascript - 使用每个 es6 对象检查每个属性的条件

javascript - 我真的需要在 javascript ES6 类中使用 setter/getter 吗?

javascript - 当用户使用 Facebook SDK for JavaScript 在 Facebook 上分享帖子时如何更新 mysql 中的数据

javascript - 日期选择器 - 单击外部时关闭

javascript - 使用 Laravel 缓存清除

function - 使用二叉树对整数上的中缀算术表达式进行编码

vb.net - 这是共享(静态)类的好候选吗?

只有 getter 的 JavaScript ES6 类

javascript - 这个 Angular 错误是什么意思?