2016-06-05 3 views
4

У меня есть класс машинопись, который имеет следующие свойства:Проверьте машинопись класс имеет сеттер/геттер

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

Они оба возвращают неопределенными. Но хром, похоже, делает это! Когда я наводил курсор на экземпляр, он показывает мне свойства и показывает их как неопределенные. Как я могу получить список этих имен свойств или проверить, существует ли в объекте дескриптор свойства? enter image description here

+0

'Object.keys (newObj) '? –

+0

Ключи не работают для неопределенных свойств – David

ответ

3

«Проблема» в том, что Object.getOwnPropertyDescriptor - как следует из названия - только возвращает дескрипторы собственных свойств объекта давал в. То есть: только свойства, которые непосредственно назначены этому объекту, не те, которые принадлежат к одному из объектов в цепочке прототипов.

В вашем примере, свойство currency определено на 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, 'currency')); // { get, set, ... } 
+0

Просто из интереса, почему вы выполняете цикл? Я получил тот же результат, просто используя 'return Object.getOwnPropertyDescriptor (Object.getPrototypeOf (viewModel), ключ);'. Затем я тестирую установщик, используя 'return isNullOrUndefined (desc) || ! isNullOrUndefined (desc.set); ' –

+0

@MattSugden Конечно, если вы знаете, что свойство определено для первого объекта в цепочке прототипов (т. е. класс построения), то вам не нужен цикл. Мой фрагмент демонстрирует, как вы можете найти свойство * в любом месте * в цепочке прототипов (т. Е. Класс построения или суперкласс или суперсуперкласс или т. Д.). –

Смежные вопросы