获取对象的构造函数名称

RoG*_*GeR 5 javascript class ecmascript-6

我怎样才能获得对象类的名称?我的意思是这个例子中的"过程"在此输入图像描述

我看到了两种获得它的方法.首先是在这个类中写一个getter

 getClassName(){return "Process"}
Run Code Online (Sandbox Code Playgroud)

但我想如果我尝试在不属于这个类的对象中调用此方法并且没有这样的方法,那将是一个错误.

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

T.J*_*der 11

你可以从name上面得到它constructor:

console.log(object.constructor.name);
Run Code Online (Sandbox Code Playgroud)

默认情况下,constructor是用于创建对象的构造函数; 它继承自对象的原型.name是它的名字.

如果你想对constructor实例本身可能存在属性有点偏执,在其原型上隐藏一个属性,你可以使用:

console.log(Object.getPrototypeOf(object).constructor.name);
Run Code Online (Sandbox Code Playgroud)

实例:

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"
Run Code Online (Sandbox Code Playgroud)

但需要注意的是,TC39委员会指定的JavaScript很愿意使用实例的constructor属性在Promise建立新的承诺,当s thencatch返回功能(见第3步这里肚里这里并读取constructor从实例),这样你就不会出来如果你也使用它自己.他们甚至没有去实例的原型.

但是,是的,只是为了完整性,即使你去它的原型,它仍然可能导致你误入歧途,因为原型的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"
Run Code Online (Sandbox Code Playgroud)

也可以重新定义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"
Run Code Online (Sandbox Code Playgroud)

所以...告诫用户.


请注意,从nameES2015开始,函数属性是新的(class语法也是如此).如果您class通过转换器使用语法,则可能name正确设置也可能不正确.

  • “*如果你想变得有点偏执*”……你不会使用任何 `.constructor` 或 `.name` 属性:-) (2认同)
  • 据我所知,“名称”在某些浏览器中是只读的。答案没有提到`name`将以缩小的代码进行修饰,这绝对是不允许在客户端代码中使用它的。 (2认同)

Est*_*ask 5

object instanceof Process如果确定object源自此类/函数,则通常是可取的。可能有些情况并非如此。出现多个Process可能是由 iframe、多个包版本等引起的。

name物业已经存在于普通功能类的构造函数。一个已知的陷阱是它会在缩小的代码中被破坏,所以它在浏览器 JS 中通常是无用的,它的使用可以被认为是一种反模式。name不能重新分配(在某些浏览器中),因此需要一个单独的属性来标识类。

正确的方法是避免这个问题

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

是使用吸气剂:

class Process {
  get className() { return 'Process'; }
  ...
}
Run Code Online (Sandbox Code Playgroud)

或者一个属性:

class Process {
  ...
}
Process.prototype.className = 'Process';
Run Code Online (Sandbox Code Playgroud)

因此,可能有多个Process具有Process className标识符的类。这可能是可取的,也可能不是。虽然将instanceof类实例与一个特定的类相关联。