Я пытаюсь выяснить, есть ли у текущего производного класса установщик свойств.Причина в том, что я зацикливаю пару опций через конструкторы расширенных классов.и просто хочу назначить те свойства, которые являются частью этого класса, а не базового класса.
Поэтому мне нужна возможность выяснить, существуют ли геттер или сеттер для этого класса или нет.Я удаляю как можно больше кода, чтобы показать только проблему.
Это базовый класс:
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 вПроизводный класс, но не в базовом классе?