我看到了两种获取它的方法。第一个是在这个类中写一个 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/