Если бы я хотел поддерживать назначение свойств объекта, используя свободную функциональную цепочку. Например, что-то вроде:Подход к функциональной цепочке с геттерами и сеттерами
foo.width(500).height(250).margin({left:5,right:10});
Я мог бы, очевидно, создать определение функции, как:
margin(value) {
this.config.margin = value;
return this;
}
Но что, если бы я хотел, чтобы быть в состоянии поддерживать вышеуказанную функцию сцепления, но также прямого назначения, как:
foo.margin = {left:5,right:10};
Я мог бы добавить эту поддержку, добавив сеттер, как:
Но у вас не может быть сеттер и функция, которые идут под тем же именем, и, по-видимому, сеттер работает только с литеральной операцией присваивания, а определение функции работает только с плавным API-интерфейсом.
Есть ли способ иметь синтаксически изящный способ с JS ES6?
Я включил скрипку, которая демонстрирует рабочий пример как оперативных, так и литеральных операторов присваивания. Единственная проблема? Мне пришлось прибегать к использованию другой именованной подписи, которая увеличивает поверхность API ... если возможно, я бы хотел этого избежать.
http://www.es6fiddle.com/i6o0jscx/
Вопрос в том, почему вы добавляете свойства, подобные тем же именам, что и функция? Я предполагаю, что это невозможно, и что вы должны просто изменить 'foo.config.margin = 'something'' вместо – adeneo
@adeneo Я не уверен, что я следую. Я считаю, что это довольно распространенная практика на других языках. Вы хотите, чтобы настройка свойства private/protected выполнялась только через сеттер, и вы хотите, чтобы к ним обращались как операторы свободного, так и буквенного присваивания. – ken
@ken Нет, в других языках нет обычной практики иметь свойства, которые иногда бывают как свойства, иногда и подобные методы. В большинстве случаев это одно или другое. Это то, чего вы пытаетесь достичь здесь, и поэтому у вас проблемы. – JLRishe