Могу ли я перечислить свойства, которые существуют только как функции получения / установки?

#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 . Поэтому он не отображается при проверке прототипа.