Пример полиморфной функции
Пример полиморфной функции – sayHi(who) , которая будет говорить «Привет» своему аргументу, причём если передан массив – то «Привет» каждому:
function sayHi(who) {
if (Array.isArray(who)) { who.forEach(sayHi);
} else {
alert( 'Привет, ' + who );
}
}
// Вызов с примитивным аргументом sayHi("Вася"); // Привет, Вася
// Вызов с массивом
sayHi(["Саша", "Петя"]); // Привет, Саша... Петя
// Вызов с вложенными массивами ‐ тоже работает!
sayHi(["Саша", "Петя", ["Маша", "Юля"]]); // Привет Саша..Петя..Маша..Юля
Проверку на массив в этом примере можно заменить на «утиную» – нам ведь нужен только метод forEach :
function sayHi(who) {
if (who.forEach) { // если есть forEach
who.forEach(sayHi); // предполагаем, что он ведёт себя "как надо"
} else {
alert( 'Привет, ' + who );
}
}
Итого
Для написания полиморфных (это удобно!) функций нам нужна проверка типов.
Для примитивов с ней отлично справляется оператор typeof .
У него две особенности:
Он считает null объектом, это внутренняя ошибка в языке.
Для функций он возвращает function , по стандарту функция не считается базовым типом, но на практике это удобно и полезно.
Для встроенных объектов мы можем получить тип из скрытого свойства [[Class]] , при помощи вызова {}.toString.call(obj).slice(8, ‐1) . Для конструкторов, которые объявлены нами, [[Class]] всегда равно "Object" .
Оператор obj instanceof Func проверяет, создан ли объект obj функцией Func , работает для любых конструкторов. Более подробно мы разберём его в главе Проверка класса: "instanceof".
И, наконец, зачастую достаточно проверить не сам тип, а просто наличие нужных свойств или методов. Это называется «утиная типизация».
✔ Задачи
Полиморфная функция formatDate
важность: 5
Напишите функцию formatDate(date) , которая возвращает дату в формате dd.mm.yy . Ее первый аргумент должен содержать дату в одном из видов:
Как объект Date .
Как строку, например yyyy‐mm‐dd или другую в стандартном формате даты.
Как число секунд с 01.01.1970 .
Как массив [гггг, мм, дд] , месяц начинается с нуля
Для этого вам понадобится определить тип данных аргумента и, при необходимости, преобразовать входные данные в нужный формат. Пример работы:
function formatDate(date) { /* ваш код */ }
alert( formatDate('2011‐10‐02') ); // 02.10.11 alert( formatDate(1234567890) ); // 14.02.09
alert( formatDate([2014, 0, 1]) ); // 01.01.14
alert( formatDate(new Date(2014, 0, 1)) ); // 01.01.14
Открыть песочницу с тестами для задачи.
К решению
Do'stlaringiz bilan baham: |