--- title: constructor slug: Web/JavaScript/Reference/Classes/constructor tags: - ECMAScript 2015 - ES6 - JavaScript - Классы translation_of: Web/JavaScript/Reference/Classes/constructor ---
constructor
- специальный метод, служащий для создания и инициализации объектов, созданных с использованием class
.constructor([arguments]) { ... }
Конструктор позволяет произвести начальную инициализацию, которая должна быть выполнена до того, как остальные методы вызваны.
class Person { constructor(name) { this.name = name; } introduce() { console.log(`Hello, my name is ${this.name}`); } } const otto = new Person('Отто'); otto.introduce();
Если вы не определили метод constructor, то будет использован конструктор по умолчанию. Если ваш класс базовый, то конструктор по умолчанию пустой:
constructor() {}
Если ваш класс является производным классом, конструктор по умолчанию вызывает родительский конструктор, передавая любые аргументы, которые были предоставлены:
constructor(...args) { super(...args); }
Это позволяет работать код:
class ValidationError extends Error { printCustomerMessage() { return `Проверка не удалась :-( (подробности: ${this.message})`; } } try { throw new ValidationError("Не правильный номер телефона"); } catch (error) { if (error instanceof ValidationError) { console.log(error.name); // Это Error вместо ValidationError! console.log(error.printCustomerMessage()); } else { console.log('Не известная ошибка', error); throw error; } }
ValidationError
классу не нужен явный (explicit) конструктор, потому что не требуется инициализация. Затем конструктор по умолчанию позаботится о инициализации родительского класса Error
переданным ему аргументом.
Однако, если определен ваш собственный конструктор и ваш класс является производным от какого-либо родительского класса, то вы должны явно объявить конструктор родительского класса, используя super
. К примеру:
class ValidationError extends Error { constructor(message) { super(message); // вызов конструктора родительского класса this.name = 'ValidationError'; this.code = '42'; } printCustomerMessage() { return `Проверка не удалась :-( (подробности: ${this.message}, code: ${this.code})`; } } try { throw new ValidationError("Не правильный номер телефона"); } catch (error) { if (error instanceof ValidationError) { console.log(error.name); // Теперь это ValidationError! console.log(error.printCustomerMessage()); } else { console.log('Не известная ошибка', error); throw error; } }
В классе может быть только один метод с именем "constructor
". Если класс содержит более одного constructor
, будет сгенерировано исключение {{jsxref("SyntaxError")}}.
constructor
Данный фрагмент кода взят из classes sample (live demo).
class Square extends Polygon { constructor(length) { // Здесь вызывается конструктор родительского класса, // в который передается length в качестве аргументов, // соответствующим полям width и height класса Polygon super(length, length); // Заметка: В производном классе, super() должен вызываться перед тем как // вы сможете использовать 'this'. Иначе будет сгенерировано исключение reference error. this.name = 'Square'; } get area() { return this.height * this.width; } set area(value) { this.area = value; } }
Посмотрите на этот отрывок кода.
class Polygon { constructor() { this.name = "Polygon"; } } class Square extends Polygon { constructor() { super(); } } class Rectangle {} Object.setPrototypeOf(Square.prototype, Rectangle.prototype); console.log(Object.getPrototypeOf(Square.prototype) === Polygon.prototype); //false console.log(Object.getPrototypeOf(Square.prototype) === Rectangle.prototype); //true let newInstance = new Square(); console.log(newInstance.name); //Polygon
Здесь прототип Square класса изменен, но в то же время constructor предыдущего базового класса Polygon вызывается при создании нового экземпляра Square.
Если вы не определите метод constructor, будет использован constructor по умолчанию. Для базовых классов, constructor по умолчанию:
constructor() {}
Для производных классов, constructor по умолчанию:
constructor(...args) { super(...args); }
Specification | Status | Comment |
---|---|---|
{{SpecName('ES2015', '#sec-static-semantics-constructormethod', 'Constructor Method')}} | {{Spec2('ES2015')}} | Изначальное определение. |
{{SpecName('ESDraft', '#sec-static-semantics-constructormethod', 'Constructor Method')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.classes.constructor")}}