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);