Использование декораторов ES в методах получения и установки класса

это нормально, согласно предложению декоратора, иметь декоратор для получателя или сеттера класса? Или они разрешены только для обычных методов? например

class Foo extends Bar {

  @override
  get someProp() {
    super.someProp + 2;
  }
}

некоторые библиотеки/фреймворки предоставляют такие декораторы. Но, например, синтаксический анализатор babel помечает это как ошибку!


person user2520818    schedule 17.10.2017    source источник
comment
Совершенно нормально иметь декоратор для любого определения свойства в теле класса. Декоратор, конечно, должен уметь работать с типом дескриптора.   -  person Bergi    schedule 17.10.2017
comment
есть ли что-то непонятное в моем ответе?   -  person Max Koretskyi    schedule 18.10.2017


Ответы (1)


Я думаю, что с точки зрения декоратора совершенно нормально применять его к полю установки/получения, практически к любому полю. Поскольку «нормальное» свойство и свойство setter/getter различаются по типу дескриптора свойства — дескриптор данных и дескриптор доступа и декоратор применяется к дескриптору свойства, его можно применить к любому свойству, включая свойства "setter/getter" и "method".

Например, вы можете изменить свойство setter на «normal» внутри декоратора:

function removesetter(klass, prop, descriptor) {
    return {
        value: 5,
        writable: true
    }
}

class Foo {
    @removesetter
    get someProp() {
        return 3;
    }
}

const f = new Foo();
console.log(f.someProp); // 5
person Max Koretskyi    schedule 17.10.2017
comment
Спасибо за ваш ответ. Будут ли проблемы, если в классе есть и сеттер, и геттер с декоратором? или достаточно, чтобы свойство get или set дескриптора обновлялось только в каждом украшении? - person user2520818; 18.10.2017
comment
и возможно ли в функции декоратора определить, является ли вызываемый метод сеттером или геттером? - person user2520818; 18.10.2017
comment
@ user2520818, декоратор вызывается с дескриптором. он указывает как геттер, так и сеттер. Я не думаю, что возможно определить метод, к которому он обращается. Оба геттера/сеттера по сути являются одним свойством со специальным дескриптором доступа, и, следовательно, вы не можете применить один и тот же декоратор к обоим сеттеру/геттеру, поскольку это не имеет смысла. - person Max Koretskyi; 18.10.2017