我看到了两种获得它的方法。首先是在这个类中编写一个getter,如
getClassName(){return "Process"}
但是我想如果我尝试在不属于这个类的对象中调用此方法并且没有这样的方法,那将是一个错误。
第二个是使用object instanceof Process
。但也许有一些方法可以让它变得更好,更正确?
答案 0 :(得分:8)
您可以name
constructor
上的console.log(object.constructor.name);
获取:
constructor
默认情况下,name
是用于创建对象的构造函数;它继承自对象的原型。 constructor
是它的名字。
如果你想对实例本身可能存在console.log(Object.getPrototypeOf(object).constructor.name);
属性有点偏执,在其原型上隐藏它,你可以使用:
class Class1 {
}
const c1 = new Class1();
console.log(c1.constructor.name); // "Class1"
class Class2 {
constructor() {
this.constructor = "I'm special";
}
}
const c2 = new Class2();
console.log(Object.getPrototypeOf(c2).constructor.name); // "Class2"
实例:
constructor
但请注意,在构建Promise
和then
返回的新承诺时,指定JavaScript的TC39委员会很高兴在catch
中使用实例的constructor
属性(请参阅步骤3 here here并从实例中读取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
所以...告诫用户。
请注意,函数class
属性是ES2015中的新属性(与class
语法一样)。如果您通过转发器使用name
语法,则可能会或可能不会正确设置geolocation
。
答案 1 :(得分:2)
在对象上使用.constructor.name
。默认情况下,每个对象的构造函数都指向其创建函数,该函数具有name属性。它返回函数的名称。
class SomeClass {
}
const obj = new SomeClass();
console.log(obj.constructor.name);

答案 2 :(得分:2)
如果确定object instanceof Process
来自此类/函数,则通常object
是可取的。可能会出现这种情况。几个Process
的外观可能由iframe,多个软件包版本等引起。
常规函数类构造函数中已存在name
property。一个已知的缺陷是它会在缩小的代码中被破坏,因此它在浏览器JS中通常是无用的,并且它的使用可以被认为是反模式。 name
无法重新分配(在某些浏览器中),因此需要单独的属性来标识该类。
正确的方法是避免这个问题
但是我想如果我尝试在不属于这个类的对象中调用此方法并且没有这样的方法,那将是一个错误。
是使用getter:
class Process {
get className() { return 'Process'; }
...
}
或属性:
class Process {
...
}
Process.prototype.className = 'Process';
因此,可能有多个Process
个类具有Process
className
标识符。这可能是可取的或不是。虽然instanceof
将类实例与一个特定类相关联。
答案 3 :(得分:0)
使用name
属性,如下所示:
class Process {}
console.log(Process.name);
const process = new Process;
console.log(process.constructor.name);

这与使用函数的正常原型继承相同。