Используете ли Вы дескрипторы в JS, если да, то в каких ситуациях?
Ну самый распространенный, но не самый разумный, вариант использования - расширение существующих прототипов (Object.prototype, Array.prototype), потому что с помощью дескрипторов можно настроить метод/свойство не перечисляемым (enumerable:false) и можно не бояться что при переборе  for(key in myObject ) методы, которые Вы добавили, будут участвовать в переборе. 
Лично я использую для методов и свойств прототипов, чтобы при переборе не использовать hasOwnProperty() и более гибко настроить доступ к ним.
Сеттеры и геттеры - в зависимости от задач. Допустим, для получения количества записей в коллекции гораздо лаконичней и правильней смотрится Collection.size нежели Collection.size()
Геттеры/сеттеры надо просто попробовать, чтобы оценить всю их прелесть.
Одним из вариантов их использования можно считать переписывание плохого кода (замена обычных полей объектов на пару get/set без изменения зависимого кода).