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

发布时间:2020-07-30 07:13:28 作者:popgis
来源:网络 阅读:224
class A {
  constructor(a, b = 'bbb', c = 1) {
    this.a = a;
    this.b = b;
    this.c = c;
  }
}

获取类的原型对象constructor属性:

const desc3 = Object.getOwnPropertyDescriptor(A.prototype, 'constructor');
console.info(desc3);

结果如下:

{ 
  value: [Function: A],
  writable: true,
  enumerable: false,
  configurable: true 
}

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

console.info(Object.getOwnPropertyDescriptors(desc3.value));

或者直接获取:

console.info(Object.getOwnPropertyDescriptors(A.prototype.constructor));

得到如下结果:

{
  length: { 
    value: 1,
    writable: false,
    enumerable: false,
    configurable: true 
  },
  prototype: { 
    value: A {},
     writable: false,
     enumerable: false,
     configurable: false 
  },
  name: { 
    value: 'A',
    writable: false,
    enumerable: false,
    configurable: true 
  } 
}

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

console.info(A.prototype.constructor.name);

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

console.info(undefined == new A().prototype);

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

const instance = new A();
const objProto = Object.getPrototypeOf(instance);
console.info(objProto === A.prototype);
console.info(Object.getOwnPropertyDescriptors(objProto));
console.info(Object.getOwnPropertyDescriptors(objProto.constructor));

以上代码的输出结果为:

true
{ constructor:
{ value: [Function: A],
writable: true,
enumerable: false,
configurable: true } }
{ length:
{ value: 1,
writable: false,
enumerable: false,
configurable: true },
prototype:
{ value: A {},
writable: false,
enumerable: false,
configurable: false },
name:
{ value: 'A',
writable: false,
enumerable: false,
configurable: true } }

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

console.info(objProto.constructor.name);
推荐阅读:
  1. 前端技术之:通过plop生成Controller的方法与步骤
  2. 前端技术之:命令模块及其执行方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

对象 原型

上一篇:net-snmp 支持ipv6

下一篇:当Node.js遇见Docker

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》