diff options
Diffstat (limited to 'files/uk/web/javascript/reference/global_objects/object/nosuchmethod/index.html')
-rw-r--r-- | files/uk/web/javascript/reference/global_objects/object/nosuchmethod/index.html | 166 |
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 < 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> |