aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/global_objects/object/nosuchmethod
diff options
context:
space:
mode:
Diffstat (limited to 'files/uk/web/javascript/reference/global_objects/object/nosuchmethod')
-rw-r--r--files/uk/web/javascript/reference/global_objects/object/nosuchmethod/index.html166
1 files changed, 166 insertions, 0 deletions
diff --git a/files/uk/web/javascript/reference/global_objects/object/nosuchmethod/index.html b/files/uk/web/javascript/reference/global_objects/object/nosuchmethod/index.html
new file mode 100644
index 0000000000..fbd98cf2e2
--- /dev/null
+++ b/files/uk/web/javascript/reference/global_objects/object/nosuchmethod/index.html
@@ -0,0 +1,166 @@
+---
+title: Object.prototype.__noSuchMethod__
+slug: Web/JavaScript/Reference/Global_Objects/Object/noSuchMethod
+tags:
+ - JavaScript
+ - Object
+ - Властивість
+ - застаріла
+ - нестандартна
+translation_of: Archive/Web/JavaScript/Object.noSuchMethod
+---
+<div>{{JSRef}}{{Non-standard_Header}}{{Obsolete_Header("gecko43")}}</div>
+
+<p>Властивість <strong><code>__noSuchMethod__</code></strong> використовувалась для посилання на функцію, що мала виконатися, коли на об'єкті викликався неіснуючий метод, але ця функція більше не доступна.</p>
+
+<p>В той час як метод <code><strong>__noSuchMethod__</strong></code> був прибраний, специфікація ECMAScript 2015 містить об'єкт {{JSxRef("Proxy")}}, який допоможе досягти описаного нижче (і навіть більше).</p>
+
+<h2 id="Синтаксис">Синтаксис</h2>
+
+<pre class="syntaxbox"><code><var>obj</var>.__noSuchMethod__ = <var>fun</var></code></pre>
+
+<h3 id="Параметри">Параметри</h3>
+
+<dl>
+ <dt><code>fun</code></dt>
+ <dd>Функція, що має вигляд</dd>
+ <dd>
+ <pre class="brush: js"><code>function (<var>id</var>, <var>args</var>) { . . . }</code></pre>
+
+ <dl>
+ <dt><code>id</code></dt>
+ <dd>Ім'я неіснуючого методу, що був викликаний</dd>
+ <dt><code>args</code></dt>
+ <dd>Масив аргументів, переданих у метод</dd>
+ </dl>
+ </dd>
+</dl>
+
+<h2 id="Опис">Опис</h2>
+
+<p>За замовчуванням спроба викликати метод, який не існує, на об'єкті призводить до викидання {{JSxRef("TypeError")}}. Цю поведінку можна обійти, визначивши функцію у властивості об'єкта <code>__noSuchMethod__</code>. Функція приймає два аргумента, перший - це ім'я метода, що викликається, другий - це масив аргументів, які передаються під час виклику. Другий аргумент є справжнім масивом (тобто, він успадковується через ланцюг {{JSxRef("Array.prototype")}}), а не подібним до масиву <a href="/uk/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments" title="JavaScript/Reference/Functions/arguments">об'єктом arguments</a>.</p>
+
+<p>Якщо цей метод не можна викликати, чи тому що він дорівнює <code>undefined</code>, чи був видалений, чи йому вручну було присвоєне нефункціональне значення, рушій JavaScript повернеться до викидання <code>TypeError</code>.</p>
+
+<h2 id="Приклади">Приклади</h2>
+
+<h3 id="Проста_перевірка___noSuchMethod__">Проста перевірка <code>__noSuchMethod__</code></h3>
+
+<pre class="brush: js">var o = {
+ __noSuchMethod__: function(id, args) {
+ console.log(id, '(' + args.join(', ') + ')');
+ }
+};
+
+o.foo(1, 2, 3);
+o.bar(4, 5);
+o.baz();
+
+// Виведе
+// foo (1, 2, 3)
+// bar (4, 5)
+// baz ()
+</pre>
+
+<h3 id="Використання___noSuchMethod___для_імітації_множинного_спадкування">Використання <code>__noSuchMethod__</code> для імітації множинного спадкування</h3>
+
+<p>Приклад коду, що реалізує примітивну форму множинного спадкування, наведений нижче.</p>
+
+<pre class="brush: js">// Не працює, якщо батьківські об'єкти є результатом множинного спадкування
+function noMethod(name, args) {
+ var parents = this.__parents_;
+
+ // Пройти через усі батьківські об'єкти
+ for (var i = 0; i &lt; parents.length; i++) {
+ // Якщо знаходимо функцію у батьківського об'єкта, викликаємо її
+ if (typeof parents[i][name] == 'function') {
+ return parents[i][name].apply(this, args);
+ }
+ }
+
+ // Якщо ми дістались сюди, метод не був знайдений
+ throw new TypeError;
+}
+
+// Додавало батьківський об'єкт для множинного спадкування
+function addParent(obj, parent) {
+ // Якщо об'єкт неініціалізований, ініціалізуємо його
+ if (!obj.__parents_) {
+ obj.__parents_ = [];
+ obj.__noSuchMethod__ = noMethod;
+ }
+
+ // Додати батьківський об'єкт
+ obj.__parents_.push(parent);
+}
+</pre>
+
+<p>Приклад використання цієї ідеї наведений нижче.</p>
+
+<pre class="brush: js">// Базовий клас 1
+function NamedThing(name) {
+ this.name = name;
+}
+
+NamedThing.prototype = {
+ getName: function() { return this.name; },
+ setName: function(newName) { this.name = newName; }
+}
+
+// Базовий клас 2
+function AgedThing(age) {
+ this.age = age;
+}
+
+AgedThing.prototype = {
+ getAge: function() { return this.age; },
+ setAge: function(age) { this.age = age; }
+}
+
+// Дочірній клас. Наслідується від NamedThing та AgedThing,
+// а також визначає адресу
+function Person(name, age, address){
+ addParent(this, NamedThing.prototype);
+ NamedThing.call(this, name);
+ addParent(this, AgedThing.prototype);
+ AgedThing.call(this, age);
+ this.address = address;
+}
+
+Person.prototype = {
+ getAddr: function() { return this.address; },
+ setAddr: function(addr) { this.address = addr; }
+}
+
+var bob = new Person('Боб', 25, 'Нью-Йорк');
+
+console.log('getAge ' + (('getAge' in bob) ? 'належить' : 'не належить') + ' Бобу');
+// getAge не належить Бобу
+
+console.log("Вік Боба: " + bob.getAge());
+// Вік Боба: 25
+
+console.log('getName ' + (('getName' in bob) ? 'належить' : 'не належить') + ' Бобу');
+// getName не належить Бобу
+
+console.log("Ім'я Боба: " + bob.getName());
+// Ім'я Боба: Боб
+
+console.log('getAddr ' + (('getAddr' in bob) ? 'належить' : 'не належить') + ' Бобу');
+// getAddr належить Бобу
+
+console.log("Адреса Боба: " + bob.getAddr());
+// Адреса Боба: Нью-Йорк
+</pre>
+
+<h2 id="Специфікації">Специфікації</h2>
+
+<p>Не є частиною жодних специфікацій. Ця функціональність була прибрана, дивіться {{bug(683218)}}.</p>
+
+<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
+
+<div>
+
+
+<p>{{Compat("javascript.builtins.Object.noSuchMethod")}}</p>
+</div>