前端技术之:如何通过类的属性获取类名

  
 <代码> A {
  构造函数(a, b=bbb, c=1) {
  这一点。一个=;
  这一点。b=b;
  这一点。c=c;
  }
  } 
  

获取类的原型对象构造函数属性:

  
 <代码> const desc3=Object.getOwnPropertyDescriptor (A。原型,构造函数);
  console.info (desc3);  
  

结果如下:

  
 <代码> {
  价值:函数:,
  可写:没错,
  可列举的:假的,
  可配置:真
  } 
  

由此看出一个的原型对象构造函数属性的值实际上是一个函数,我们进一步获取这个函数的属性描述:

  
 <代码> console.info (Object.getOwnPropertyDescriptors (desc3.value));  
  

或者直接获取:

  
 <代码> console.info (Object.getOwnPropertyDescriptors (A.prototype.constructor));  
  

得到如下结果:

  
 <代码> {
  长度:{
  值:1
  可写:假的,
  可列举的:假的,
  可配置:真
  },
  原型:{
  价值:{},
  可写:假的,
  可列举的:假的,
  可配置:假
  },
  名称:{
  值:' A ',
  可写:假的,
  可列举的:假的,
  可配置:真
  }
  } 
  

由此可以知道,我们可以通过类的prototype.constructor.name属性获取到类名。

  
 <代码> console.info (A.prototype.constructor.name);  
  

我们已经知道了如何通过属性获取类的名称,但对像类实例对象直接使用这种方法是行不通的,原因是类的对象实例没有原型属性。

  
 <代码> console.info(未定义==new () .prototype);  
  

以上输出结果为:真的,说明类的实例对象是没有原型属性的。但我们可以通过Object.getPrototypeOf获取到对象对应的原型。

  
 <代码> const实例=new ();
  const objProto=Object.getPrototypeOf(实例);
  console.info (objProto===A.prototype);
  console.info (Object.getOwnPropertyDescriptors (objProto));
  console.info (Object.getOwnPropertyDescriptors (objProto.constructor));  
  

以上代码的输出结果为:

  
 <代码>正确的
  {构造函数:
  {值:函数:,
  可写:没错,
  可列举的:假的,
  可配置:真}}
  {长度:
  {价值:1、
  可写:假的,
  可列举的:假的,
  可配置:真},
  原型:
  {值:{},
  可写:假的,
  可列举的:假的,
  可配置:假},
  名称:
  {值:' A ',
  可写:假的,
  可列举的:假的,
  可配置:真}} 
  

说明通过Object.getPrototypeOf获取到的对象原型与类的原型对象是同一个实例。获取到原型对象后,我们就可以获取到对象的类名。

  
 <代码> console.info (objProto.constructor.name);  

前端技术之:如何通过类的属性获取类名