class A { constructor(a, b = 'bbb', c = 1) { this.a = a; this.b = b; this.c = c; } }
获取类的原型对象constructor属性:this
const desc3 = Object.getOwnPropertyDescriptor(A.prototype, 'constructor'); console.info(desc3);
结果以下:prototype
{ value: [Function: A], writable: true, enumerable: false, configurable: true }
由此看出A的原型对象constructor属性的值其实是一个Function,咱们进一步获取这个Function的属性描述:code
console.info(Object.getOwnPropertyDescriptors(desc3.value));
或者直接获取:对象
console.info(Object.getOwnPropertyDescriptors(A.prototype.constructor));
获得以下结果:ip
{ 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属性获取到类名。get
console.info(A.prototype.constructor.name);
咱们已经知道了如何经过属性获取类的名称,但对像类实例对象直接使用这种方法是行不通的,缘由是类的对象实例没有prototype属性。原型
console.info(undefined == new A().prototype);
以上输出结果为:true,说明类的实例对象是没有prototype属性的。但咱们能够经过Object.getPrototypeOf获取到对象对应的原型。it
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));
以上代码的输出结果为:io
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
console.info(objProto.constructor.name);