获取对象的构造函数名称

时间:2017-09-14 11:25:58

标签: javascript class ecmascript-6

如何获取对象类的名称?我的意思是“示例”中的“处理”enter image description here

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

 getClassName(){return "Process"}

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

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

4 个答案:

答案 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

但请注意,在构建Promisethen返回的新承诺时,指定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);




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