#javascript
#javascript
Вопрос:
Учитывая класс, подобный этому
class Stuff {
set b(v) {
}
get c() {
return 'x'
}
}
const x = new Stuff
console.log(x.hasOwnProperty('b'))
как я могу проверить «свойства» b и c или перечислить все такие getter / setters? hasOwnProperty
не показывает, что они существуют.
Комментарии:
1. сравните
Object.getOwnPropertyDescriptors(x)
сObject.getOwnPropertyDescriptors(Object.getPrototypeOf(x))
Ответ №1:
Как и все свойства, определенные с помощью синтаксиса метода (будь то getter / setter или нет), они находятся в прототипе, а не в экземпляре, поэтому вызывайте hasOwnProperty
прототип:
class Stuff {
set b(v) {
}
get c() {
return 'x'
}
notGetter() {}
}
const x = new Stuff
console.log(
Object.getPrototypeOf(x).hasOwnProperty('b'),
Stuff.prototype.hasOwnProperty('b')
);
const allGettersSetters = Object.entries(Object.getOwnPropertyDescriptors(Stuff.prototype))
.filter(([, value]) => !value.hasOwnProperty('value'))
.map(([key]) => key);
console.log(allGettersSetters);
Комментарии:
1. Это работает, спасибо! Возможно, вы также знаете, почему 1default` не отображается в прототипе здесь? « lass Stuff { default = 3 set b(v) { } get c() { return ‘x’ } notGetter() {} } const x = новый Материал console.log( Object.getPrototypeOf(x).hasOwnProperty(‘b’), Stuff.prototype.hasOwnProperty(‘b’), Stuff.prototype.hasOwnProperty(‘default’), x.hasOwnProperty(‘default’), ); «
2. Это не в прототипе, а в экземпляре. Поля класса — то есть
=
s непосредственно внутри тела класса — являются синтаксическим сахаром для, в конструкторе,this.someProp = someVal
. Поэтому он не отображается при проверке прототипа.