我有一个typescript类,它具有以下属性:
export class apiAccount { private _balance : apiMoney; get balance():apiMoney { return this._balance; } set balance(value : apiMoney) { this._balance = value; } private _currency : string; get currency():string { return this._currency; } set currency(value : string) { this._currency = value; } ...
我需要创建这个类的空白实例:
let newObj = new apiAccount();
然后检查它是否具有“货币”的设置器.
我认为这正是getOwnPropertyDescriptor所做的,但显然我错了:
Object.getOwnPropertyDescriptor(newObj,'currency') Object.getOwnPropertyDescriptor(newObj,'_currency')
这两个都返回undefined.但铬似乎做到了!当我将鼠标悬停在实例上时,它会向我显示属性,并将它们显示为未定义.如何获取这些属性名称的列表,或检查对象中是否存在属性描述符?
解决方法
“问题”是Object.getOwnPropertyDescriptor – 顾名思义 – 只返回对象自己的属性的描述符.即:只有直接分配给该对象的属性,而不是来自其原型链中某个对象的属性.
在您的示例中,货币属性在apiAccount.prototype上定义,而不是在newObj上定义.以下代码段演示了这一点:
class apiAccount { private _currency : string; get currency():string { return this._currency; } set currency(value : string) { this._currency = value; } } let newObj = new apiAccount(); console.log(Object.getOwnPropertyDescriptor(newObj,'currency')); // undefined console.log(Object.getOwnPropertyDescriptor(apiAccount.prototype,'currency')); // { get,set,... }
如果要在对象的原型链中的任何位置找到属性描述符,则需要使用Object.getPrototypeOf进行循环:
function getPropertyDescriptor(obj: any,prop: string) : PropertyDescriptor { let desc; do { desc = Object.getOwnPropertyDescriptor(obj,prop); } while (!desc && (obj = Object.getPrototypeOf(obj))); return desc; } console.log(getPropertyDescriptor(newObj,... }