aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/classes/constructor
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:42:52 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:42:52 -0500
commit074785cea106179cb3305637055ab0a009ca74f2 (patch)
treee6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/web/javascript/reference/classes/constructor
parentda78a9e329e272dedb2400b79a3bdeebff387d47 (diff)
downloadtranslated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.gz
translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.bz2
translated-content-074785cea106179cb3305637055ab0a009ca74f2.zip
initial commit
Diffstat (limited to 'files/ru/web/javascript/reference/classes/constructor')
-rw-r--r--files/ru/web/javascript/reference/classes/constructor/index.html205
1 files changed, 205 insertions, 0 deletions
diff --git a/files/ru/web/javascript/reference/classes/constructor/index.html b/files/ru/web/javascript/reference/classes/constructor/index.html
new file mode 100644
index 0000000000..7d7fe14e82
--- /dev/null
+++ b/files/ru/web/javascript/reference/classes/constructor/index.html
@@ -0,0 +1,205 @@
+---
+title: constructor
+slug: Web/JavaScript/Reference/Classes/constructor
+tags:
+ - ECMAScript 2015
+ - ES6
+ - JavaScript
+ - Классы
+translation_of: Web/JavaScript/Reference/Classes/constructor
+---
+<div>{{jsSidebar("Classes")}}</div>
+
+<div><code>constructor</code> - специальный метод, служащий для создания и инициализации объектов, созданных с использованием <code>class</code>.</div>
+
+<h2 id="Синтаксис">Синтаксис</h2>
+
+<pre class="syntaxbox notranslate">constructor([arguments]) { ... }</pre>
+
+<h2 id="Описание">Описание</h2>
+
+<p>Конструктор позволяет произвести начальную инициализацию, которая должна быть выполнена до того, как остальные методы вызваны.</p>
+
+<pre class="notranslate">class Person {
+
+ constructor(name) {
+ this.name = name;
+ }
+
+ introduce() {
+ console.log(`Hello, my name is ${this.name}`);
+ }
+
+}
+
+const otto = new Person('Отто');
+
+otto.introduce();</pre>
+
+<p>Если вы не определили метод constructor, то будет использован конструктор по умолчанию. Если ваш класс базовый, то конструктор по умолчанию пустой:</p>
+
+<pre class="notranslate">constructor() {}</pre>
+
+<p>Если ваш класс является производным классом, конструктор по умолчанию вызывает родительский конструктор, передавая любые аргументы, которые были предоставлены:</p>
+
+<pre class="notranslate">constructor(...args) {
+ super(...args);
+}</pre>
+
+<p>Это позволяет работать код:</p>
+
+<pre class="notranslate">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;
+ }
+}</pre>
+
+<p><code>ValidationError</code> классу не нужен явный (explicit) конструктор, потому что не требуется инициализация. Затем конструктор по умолчанию позаботится о инициализации родительского класса <code>Error</code> переданным ему аргументом.</p>
+
+<p>Однако, если определен ваш собственный конструктор и ваш класс является производным от какого-либо родительского класса, то вы должны явно объявить конструктор родительского класса, используя <code>super</code>. К примеру:</p>
+
+<pre class="notranslate">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;
+ }
+}</pre>
+
+<p>В классе может быть только один метод с именем "<code>constructor</code>". Если класс содержит более одного <code>constructor</code>, будет сгенерировано исключение {{jsxref("SyntaxError")}}.</p>
+
+<h2 id="Примеры">Примеры</h2>
+
+<h3 id="Использование_метода_constructor">Использование метода <code>constructor</code></h3>
+
+<p>Данный фрагмент кода взят из <a href="https://github.com/GoogleChrome/samples/blob/gh-pages/classes-es6/index.html">classes sample</a> (<a href="https://googlechrome.github.io/samples/classes-es6/index.html">live demo</a>).</p>
+
+<pre class="brush: js notranslate">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;
+ }
+}</pre>
+
+<h3 id="Другой_пример">Другой пример</h3>
+
+<p>Посмотрите на этот отрывок кода.</p>
+
+<pre class="brush: js notranslate">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</pre>
+
+<p>Здесь прототип <strong>Square</strong> класса изменен, но в то же время constructor предыдущего базового класса <strong>Polygon</strong> вызывается при создании нового экземпляра <strong>Square</strong>.</p>
+
+<h3 id="Constructors_по_умолчанию.">Constructors по умолчанию.</h3>
+
+<p>Если вы не определите метод constructor, будет использован constructor по умолчанию. Для базовых классов, constructor по умолчанию:</p>
+
+<pre class="brush: js notranslate">constructor() {}</pre>
+
+<p>Для производных классов, constructor по умолчанию:</p>
+
+<pre class="brush: js notranslate">constructor(...args) {
+ super(...args);
+}</pre>
+
+<h2 id="Спецификация">Спецификация</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Specification</th>
+ <th scope="col">Status</th>
+ <th scope="col">Comment</th>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES2015', '#sec-static-semantics-constructormethod', 'Constructor Method')}}</td>
+ <td>{{Spec2('ES2015')}}</td>
+ <td>Изначальное определение.</td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ESDraft', '#sec-static-semantics-constructormethod', 'Constructor Method')}}</td>
+ <td>{{Spec2('ESDraft')}}</td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Совместимость_с_браузерами">Совместимость с браузерами</h2>
+
+<div class="hidden">Таблица совместимости на этой странице создается из структурированных данных. Если вы хотите внести свой вклад в данные, ознакомьтесь с <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> и отправить нам запрос на слияние.</div>
+
+<p>{{Compat("javascript.classes.constructor")}}</p>
+
+<h2 id="Смотрите_также">Смотрите также</h2>
+
+<ul>
+ <li><a href="/ru/docs/Web/JavaScript/Reference/Operators/super">super()</a></li>
+ <li><a href="/ru/docs/Web/JavaScript/Reference/Operators/class"><code>class</code> expression</a></li>
+ <li><a href="/ru/docs/Web/JavaScript/Reference/Statements/class"><code>class</code> declaration</a></li>
+ <li><a href="/ru/docs/Web/JavaScript/Reference/Classes">Classes</a></li>
+ <li><a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor">Object.prototype.constructor</a></li>
+</ul>