aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/global_objects/object/constructor
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:43:23 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:43:23 -0500
commit218934fa2ed1c702a6d3923d2aa2cc6b43c48684 (patch)
treea9ef8ac1e1b8fe4207b6d64d3841bfb8990b6fd0 /files/uk/web/javascript/reference/global_objects/object/constructor
parent074785cea106179cb3305637055ab0a009ca74f2 (diff)
downloadtranslated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.tar.gz
translated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.tar.bz2
translated-content-218934fa2ed1c702a6d3923d2aa2cc6b43c48684.zip
initial commit
Diffstat (limited to 'files/uk/web/javascript/reference/global_objects/object/constructor')
-rw-r--r--files/uk/web/javascript/reference/global_objects/object/constructor/index.html237
1 files changed, 237 insertions, 0 deletions
diff --git a/files/uk/web/javascript/reference/global_objects/object/constructor/index.html b/files/uk/web/javascript/reference/global_objects/object/constructor/index.html
new file mode 100644
index 0000000000..ef2362cdec
--- /dev/null
+++ b/files/uk/web/javascript/reference/global_objects/object/constructor/index.html
@@ -0,0 +1,237 @@
+---
+title: Object.prototype.constructor
+slug: Web/JavaScript/Reference/Global_Objects/Object/constructor
+tags:
+ - JavaScript
+ - Object
+ - Властивість
+ - прототип
+translation_of: Web/JavaScript/Reference/Global_Objects/Object/constructor
+---
+<div>{{JSRef}}</div>
+
+<p>Повертає посилання на функцію-конструктор {{jsxref("Object", "об'єкта")}}, що створила екземпляр об'єкта. Зауважте, що значення цієї властивості є посиланням на саму функцію, а не рядком, що містить ім'я функції. Значення, доступне лише для читання, мають лише примітивні значення, як то <code>1</code>, <code>true</code> або <code>"test"</code>.</p>
+
+<h2 id="Опис">Опис</h2>
+
+<p>Усі об'єкти (за виключенням об'єктів, створених через <code>Object.create(null)</code>) матимуть властивість <code>constructor</code>. Об'єкти, створені без явного використання функції-конструктора (тобто, об'єктними та масивними літералами), матимуть властивість <code>constructor</code>, що вказує на конструктор фундаментального об'єкта для цього об'єкта.</p>
+
+<pre class="brush: js">var o = {};
+o.constructor === Object; // true
+
+var o = new Object;
+o.constructor === Object; // true
+
+var a = [];
+a.constructor === Array; // true
+
+var a = new Array;
+a.constructor === Array; // true
+
+var n = new Number(3);
+n.constructor === Number; // true</pre>
+
+<h2 id="Приклади">Приклади</h2>
+
+<h3 id="Відображення_конструктора_об'єкта">Відображення конструктора об'єкта</h3>
+
+<p>Наступний приклад створює конструктор <code>Tree</code> та об'єкт цього типу, <code>theTree</code>. Далі приклад демонструє властивість <code>constructor</code> об'єкта <code>theTree</code>.</p>
+
+<pre class="brush: js">function Tree(name) {
+ this.name = name;
+}
+
+var theTree = new Tree('Redwood');
+console.log('theTree.constructor дорівнює ' + theTree.constructor);
+</pre>
+
+<p>Цей приклад виведе наступний результат:</p>
+
+<pre class="brush: js">theTree.constructor дорівнює function Tree(name) {
+ this.name = name;
+}
+</pre>
+
+<h3 id="Зміна_конструктора_об'єкта">Зміна конструктора об'єкта</h3>
+
+<p>Наступний приклад покаже як можна змінити конструктор загальних об'єктів. Тільки <code>true</code>, <code>1</code> та <code>"test"</code> не зміняться, оскілки їхні конструктори доступні лише для читання. Цей приклад демонструє, що не завжди безпечно покладатися на властивість об'єкта <code>constructor</code>.</p>
+
+<pre class="brush:js">function Type () {}
+
+var types = [
+ new Array(),
+ [],
+ new Boolean(),
+ true, // лишається незмінним
+ new Date(),
+ new Error(),
+ new Function(),
+ function () {},
+ Math,
+ new Number(),
+ 1, // лишається незмінним
+ new Object(),
+ {},
+ new RegExp(),
+ /(?:)/,
+ new String(),
+ 'test' // лишається незмінним
+];
+
+for (var i = 0; i &lt; types.length; i++) {
+ types[i].constructor = Type;
+ types[i] = [types[i].constructor, types[i] instanceof Type, types[i].toString()];
+}
+
+console.log(types.join('\n'));
+</pre>
+
+<p>Цей приклад виведе наступний результат (коментарі додані для довідки):</p>
+
+<pre class="brush: js">function Type() {},false, // new Array()
+function Type() {},false, // []
+function Type() {},false,false // new Boolean()
+function Boolean() {
+ [native code]
+},false,true // true
+function Type() {},false,Mon Sep 01 2014 16:03:49 GMT+0600 // new Date()
+function Type() {},false,Error // new Error()
+function Type() {},false,function anonymous() {
+
+} // new Function()
+function Type() {},false,function () {} // function () {}
+function Type() {},false,[object Math] // Math
+function Type() {},false,0 // new Number()
+function Number() {
+ [native code]
+},false,1 // 1
+function Type() {},false,[object Object] // new Object()
+function Type() {},false,[object Object] // {}
+function Type() {},false,/(?:)/ // new Regexp()
+function Type() {},false,/(?:)/ // /(?:)/
+function Type() {},false, // new String()
+function String() {
+ [native code]
+},false,test</pre>
+
+<h3 id="Зміна_конструктора_функції">Зміна конструктора функції</h3>
+
+<p>Переважно ця властивість використовується для визначення функції як <strong>функції-конструктора</strong> з подальшим викликом її з оператором <strong>new</strong> та наслідуванням через ланцюжок прототипів.</p>
+
+<pre class="brush: js">function Parent() {}
+Parent.prototype.parentMethod = function parentMethod() {};
+
+function Child() {}
+Child.prototype = Object.create(Parent.prototype); // перевизначення дочірнього прототипу на прототип Parent
+
+Child.prototype.constructor = Child; // повернення початкового конструктора прототипу Child</pre>
+
+<p>Але коли нам потрібно виконувати цей останній рядок? Нажаль, відповідь - залежить від обставин.</p>
+
+<p>Спробуємо визначити випадки, коли переприсвоєння початкового конструктора зіграє важливу роль, а коли воно стане додатковим непотрібним рядком коду.</p>
+
+<p>Візьмемо наступний випадок: об'єкт має метод <strong>create</strong> для створення самого себе.</p>
+
+<pre class="brush: js">function Parent() {};
+function CreatedConstructor() {}
+
+CreatedConstructor.prototype = Object.create(Parent.prototype);
+
+CreatedConstructor.prototype.create = function create() {
+ return new this.constructor();
+}
+
+new CreatedConstructor().create().create(); // TypeError undefined is not a function, оскільки constructor === Parent</pre>
+
+<p>У наведеному вище прикладі виняток виникне тому, що конструктор посилається на Parent.</p>
+
+<p>Щоб уникнути цього, просто призначте потрібний конструктор, який ви збираєтесь використовувати.</p>
+
+<pre class="brush: js">function Parent() {};
+function CreatedConstructor() {}
+
+CreatedConstructor.prototype = Object.create(Parent.prototype);
+CreatedConstructor.prototype.constructor = CreatedConstructor; // призначте конструктор, який будете використовувати
+
+CreatedConstructor.prototype.create = function create() {
+ return new this.constructor();
+}
+
+new CreatedConstructor().create().create(); // так непогано</pre>
+
+<p>Гаразд, тепер зрозуміло, чому зміна конструктора може бути досить корисною.</p>
+
+<p>Розглянемо інший випадок.</p>
+
+<pre class="brush: js">function ParentWithStatic() {}
+
+ParentWithStatic.startPosition = { x: 0, y:0 };
+ParentWithStatic.getStartPosition = function getStartPosition() {
+ return this.startPosition;
+}
+
+function Child(x, y) {
+ this.position = {
+ x: x,
+ y: y
+ };
+}
+
+Child.prototype = Object.create(ParentWithStatic.prototype);
+Child.prototype.constructor = Child;
+
+Child.prototype.getOffsetByInitialPosition = function getOffsetByInitialPosition() {
+ var position = this.position;
+ var startPosition = this.constructor.getStartPosition(); // error undefined is not a function, оскільки конструктор - Child
+
+ return {
+ offsetX: startPosition.x - position.x,
+ offsetY: startPosition.y - position.y
+ }
+};</pre>
+
+<p>В цьому прикладі нам треба залишити батьківський конструктор, щоб все працювало як слід.</p>
+
+<p><strong>Висновок</strong>: ручна зміна або встановлення конструктора може призвести до різноманітних та іноді заплутаних наслідків. Щоб запобігти цьому, визначте роль конструктора у кожному конкретному випадку. В більшості випадків конструктор не використовується, і в перепризначенні немає необхідності.</p>
+
+<h2 id="Специфікації">Специфікації</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Специфікація</th>
+ <th scope="col">Статус</th>
+ <th scope="col">Коментар</th>
+ </tr>
+ <tr>
+ <td>{{SpecName('ESDraft', '#sec-object.prototype.constructor', 'Object.prototype.constructor')}}</td>
+ <td>{{Spec2('ESDraft')}}</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES6', '#sec-object.prototype.constructor', 'Object.prototype.constructor')}}</td>
+ <td>{{Spec2('ES6')}}</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES5.1', '#sec-15.2.4.1', 'Object.prototype.constructor')}}</td>
+ <td>{{Spec2('ES5.1')}}</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>{{SpecName('ES1')}}</td>
+ <td>{{Spec2('ES1')}}</td>
+ <td>Початкове визначення. Реалізоване у JavaScript 1.1.</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
+
+<div class="hidden">
+<p>The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>
+</div>
+
+<p>{{Compat("javascript.builtins.Object.constructor")}}</p>
+
+<div id="compat-mobile"></div>