какая между ними разница без учета синтаксиса, что может один чего не может другой, и как это связано с метапрограммированием, когда метапрограммирование - это изменение кода во время интерпретации.
vasIvas, я немного пользовался дескрипторами объекта, они помогают найстроить поля объекта, добавить флаги, геттеры, сеттеры, и я недавно узнал про объект Proxy который считается шагом в метапрограммирование, и может перехвачивать обращение к объекту, те же геттеры и сеттеры, и я немного не понимаю что когда лучше использовать, у них возможности почти одни и те же, и почему дескрипторы не считаются метапрограммированием а proxy им есть.
Я вроде как в курсе и что такое дескриптор и что такое Proxy, и я затрудняюсь ответить какая между ними разница, потому что это не связанные вещи. Дескриптор это просто объект, вообще любой объект, просто он каким-то определенным образом обрабатывается в некоторых методах Object.prototype. Отдельного термина "дескриптор" не существует.
Proxy это интерфейс не имеющий аналогов в JS. Как пример: с Proxy вы сможете поймать обращение к несуществующему свойству, а с геттером не сможете.
ЗЫ: вероятно вопрос можно перефразировать как "какая разница между геттером/сеттером и Proxy get/set?".
iamevg_, с сотворения спецификации ECMA-262. Требование наличия свойств value/get/set не превращает дескриптор в какой-то особый тип объекта, это всё тот же объект, просто в нем есть свойства value/get/set.
Дескрипторы - правила по которым работают свойства объекта - то, изменяемые они или нет
Proxy - это внешняя обертка, которая перехватывает обращение к основным действиям над объектом и его свойствами ([[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] и т.д.) и позволяет их подменять
Proxy может подменять данные, но обязан следовать "правилам", которые устанавливает дескриптор
Дескрипторы работают на уровне отдельных свойств
Proxy работает на уровне всего объекта
Схожесть из-за которой многие не понимают и путают их - они оба перехватывают запись и чтение свойства - get и set
```
Object.defineProperty(obj, 'key', {
get() { return 42; },
set(val) { console.log(val); }
});
// Proxy
new Proxy(obj, {
get(target, key) { return 42; },
set(target, key, val) { console.log(val); }
});
```
Но на этом их свойства заканчиваются