JavaScript. Подробное руководство, 6-е издание, стр. 115
Примеры грубого определения типа, представленные выше, опираются на возможность сравнения объектов с помощью оператора
<b><</b><b>length</b><b>triathlon()</b><b>TriAthlete</b><b>walk(), swim()</b><b>bike().</b><b>Range</b><b><</b><b>++</b><b>compareTo()</b><b>succ()</b>Можно подойти к определению типа либерально: просто предположить, что входные объекты реализуют все необходимые методы, и не выполнять никаких проверок. Если предположение окажется ошибочным, при попытке вызвать несуществующий метод возникнет ошибка. Другой подход заключается в реализации проверки входных объектов. Однако, вместо того чтобы проверять их принадлежность к определенному классу, можно проверить наличие методов с определенными именами. Это позволит отвергнуть входные объекты раньше и вернуть более информативное сообщение об ошибке.
В примере 9.5 определяется функция
<b>quacks()</b><b>implements</b><b>quacks()</b>Пример 9.5. Функция грубой проверки типа
<b>// Возвращает true, если о реализует методы, определяемые последующими аргументами.</b><b>function quacks(o /*, ... */) {</b><b>for(var i=1; i<arguments.length; i++) { // для каждого аргумента после о</b><b> var arg = arguments[i];</b><b> switch(typeof arg) { // Если arg - это:</b><b> case ’string': // строка: проверить наличие метода с этим именем</b><b> if (typeof o[arg] !== "function") return false;</b><b> continue;</b><b> case ’function’: //функция: использовать объект-прототип</b><b> // Если аргумент является функцией, использовать ее прототип</b><b> arg = arg.prototype;</b><b> // переход к следующему случаю case</b><b> case object': // объект: проверить наличие соотв. методов</b><b> for(var m in arg) { // Для каждого свойства объекта</b><b> if (typeof arg[m]!=="function") continue; // Пропустить свойства,</b><b> // не являющиеся методами</b><b> if (typeof o[m] !== "function") return false;</b><b> }</b><b> }</b><b> }</b><b> // Если мы попали сюда, значит, объект о реализует все, что требуется</b><b> return true;</b><b>}</b>Есть два важных момента, касающиеся функции
<b>quacks(),</b><b>quacks(),</b><b>quacks(o, Array),</b><b>о</b><b>Array</b><b>for/in</b><b>quacks()</b><b>Object.getOwnProperty Names()</b>9.6. Приемы объектно-ориентированного программирования в JavaScript
До сих пор в этой главе мы рассматривали архитектурные основы классов в языке JavaScript: важную роль объектов-прототипов, связь классов с функциями-конструкторами, как действует оператор
<b>instanceof</b>9.6.1. Пример: класс множества
Множество - это структура данных, представляющая неупорядоченную коллекцию неповторяющихся значений. К фундаментальным операциям над множествами относятся сложение множеств и проверка вхождения значения в множество, и обычно множества реализуются так, чтобы эти операции имели максимальную скорость выполнения. Объекты в языке JavaScript по сути являются множествами имен свойств, где с каждым именем связано некоторое значение. Таким образом, объекты легко можно использовать как множества строк. В примере 9.6 реализован более универсальный класс
<b>Set</b><b>Set</b>