Быстрый старт с выражениями классов
В этой статье рассматривается, как создать класс динамическим способом с использованием выражений класса. Это может быть удобно при создании простых классов, используемых для построения объектов для передачи данных.
Рассмотрим, например, следующий класс Todo
.
class Todo{ constructor(title, completed){ this.title = title; this.completed = completed; } }
Когда у нас есть класс Todo
, мы можем использовать его для создания объектов todo, подобных следующему.
const todo = new Todo("Learn", false); //Todo {title: "Learn", completed: false}
Конструктор функций
Помните, что до создания классов объекты также можно создавать с помощью конструкторов функций. Предыдущий класс Todo
может выглядеть так при реализации с использованием конструктора функции.
function Todo(title, completed){ this.title = title; this.completed = completed; }
Затем мы можем использовать конструктор функции Todo
для создания нового объекта todo.
const todo = new Todo("Learn", false); //Todo {title: "Learn", completed: false}
Конструктор функций Builder
Функции являются значениями, поэтому мы можем создать новую функцию, возвращающую эту функцию-конструктор.
function createConstructor(){ return function(title, completed){ this.title = title; this.completed = completed; } }
Затем мы используем функцию построителя (createConstructor
), чтобы создать конструктор Todo
.
const Todo = createConstructor();
Когда у нас есть конструктор Todo
, мы можем создать новый объект todo.
const todo = new Todo("Learn", false); //{title: "Learn", completed: false}
Мы можем сделать createConstructor
более универсальным, взяв в качестве входных данных все возможные имена свойств. В возвращаемой функции-конструкторе мы используем эти имена свойств, чтобы установить соответствующие значения для текущего объекта.
function createConstructor(...propNames){ return function(...propValues){ propNames.forEach((name, idx) => { this[name] = propValues[idx]; }); } }
Обратите внимание, что если свойство title
является первым при вызове построителя (createConstructor
), то соответствующее значение появляется первым при вызове функции конструктора (Todo
).
Ниже приведен пример динамического построения конструктора функции Todo
, а затем его использования для создания нового объекта todo.
const Todo = createConstructor('title', 'completed'); const todo = new Todo("Learn", false); //{title: "Learn", completed: false}
Выражение класса
Выражение класса позволяет определять класс с именем или без имени. Это похоже на выражение функции.
Как и выражение функции, выражение класса может быть возвращено функцией. Ниже приведена предыдущая функция построителя, возвращающая выражение класса. Возвращаемое выражение класса строит те же объекты, что и предыдущая возвращенная функция-конструктор.
function createConstructor(...propNames){ return class { constructor(...propValues){ propNames.forEach((name, idx) => { this[name] = propValues[idx]; }); } } }
Ниже приведен пример динамического построения класса Todo
, а затем его использования для создания нового объекта todo.
const Todo = createConstructor('title', 'completed'); const todo = new Todo("Learn", false); //{title: "Learn", completed: false}
Это все. Спасибо за чтение.