GET или SET определены в классе - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь выяснить, есть ли у текущего производного класса установщик свойств.Причина в том, что я зацикливаю пару опций через конструкторы расширенных классов.и просто хочу назначить те свойства, которые являются частью этого класса, а не базового класса.

Поэтому мне нужна возможность выяснить, существуют ли геттер или сеттер для этого класса или нет.Я удаляю как можно больше кода, чтобы показать только проблему.

Это базовый класс:

class baseClass{
    constructor(wOptions){
        //do some stuff
        if(typeof wOptions == "object"){
            for(let prop in wOptions){
                // if(Object.getOwnPropertyDescriptor(this, prop) != undefined){
                // if(this.hasOwnProperty(prop) != undefined){ /* doesn't work either */
                if(typeof this[prop] != "undefined"){ /* calls the getter, if exists.  */
                    this[prop] = wOptions[prop];
                    delete wOptions[prop];
                } 
            }
        }       
    }
    get mainProperty(){
        return 42;
    }
    set mainProperty(newValue){
        return 42;
    }
}

Вот производный класс:

class derivatedClass extends baseClass{
    constructor(wOptions){
        super(wOptions)
        //do some other stuff 
        let html = document.body;
        Object.defineProperty(this, "html", {value: html, writable: false});

        if(typeof wOptions == "object"){
            for(let prop in wOptions){
                // if(Object.getOwnPropertyDescriptor(this, prop) != undefined){
                // if(this.hasOwnProperty(prop) != undefined){ /* doesn't work either */
                if(typeof this[prop] != "undefined"){ /* calls the getter, if exists.  */
                    this[prop] = wOptions[prop];
                    delete wOptions[prop];
                } 
            }
        }       
    }
    get otherProperty(){
        return html.innerText;
    }
    set otherProperty(newValue){
        return html.innerText = newValue;
    }
}

И как инициализировать объект:

let options = {otherProperty: "new Text"};
let object = new derivatedClass(options);
console.log(options);

Относительно уже опробованных решений:

  • getOwnPropertyDescriptor всегда возвращает undefined;возвращает options как назначено
  • hasOwnProperty всегда возвращает false;возвращает options как назначено
  • typeof this[prop] != "undefined" вызывает геттер, и это может быть довольно плохо, потому что html еще не определен.Ссылочная ошибка для html.innerText
  • Не решение, а для проверки: при удалении предложения if в производном классе изменяется основной текст на new Text и печатается пустой объект в консоли.

Протестировано в Chrome 71.

Было бы несколько вариантов, чтобы избежать этого:

  • сдвигает все свойства, обрабатываемые этим классом, в другой объект (довольно уродливо ивысокая вероятность забыть свойство в списке)
  • всегда использовать Object.defineProperty, потому что они будут выполнены после вызова super.Тем не менее, это не так красиво, как функции get / set конструкции класса.

Есть ли возможность узнать, есть ли доступный установщик для otherProperty, который оценивает true вПроизводный класс, но не в базовом классе?

1 Ответ

0 голосов
/ 02 января 2019

Попробуйте это

const descriptor = Object.getOwnPropertyDescriptor(derivatedClass.prototype, 'otherProperty');
console.log(descriptor);

Если derivatedClass.prototype имеет otherProperty (в противном случае возвращает undefined), он вернет объект, содержащий некоторые значения.В возвращенном объекте вы должны увидеть get и set

Подробнее здесь

...