javascript – 检查typescript类是否有setter/getter

前端之家收集整理的这篇文章主要介绍了javascript – 检查typescript类是否有setter/getter前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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,... }

猜你在找的JavaScript相关文章