ООП в JavaScriptНаследованиеmedium

Полифил Array.from

Реализуйте полифил (свою версию) статического метода Array.from под названием Array.from2.

Array.from принимает три аргумента:

  • iterable или array-like объект;
  • (опционально) колбэк, который будет применяться к каждому элементу объекта перед добавлением в результат;
  • (опционально) this этого колбэка.

Для простоты будем считать, что у нас всегда передаются корректные аргументы. Например, не будет вызовов, где первым агрументом передается null или вторым аргументом передается не функция.

Немного теории

Понятие iterable означает, что объект перебираемый. На практике это значит, что мы можем развернуть его через spread синтаксис, перебрать с помощью цикла for of или использовать на нем деструктуризацию. У iterable сущности реализован метод Symbol.iterator.

const map = new Map(); map.set(1, "a"); map.set(2, "b"); console.log(Array.from(map)); // [[1, "a"], [2, "b"]]

Понятие array-like означает, что у объекта есть длина и индексы.

const obj = {0: "x", 1: "y", length: 2}; console.log(Array.from(obj)); // ["x", "y"]

Особенности статических методов

Статические методы — это не просто функции, которые для удобства положили внутрь класса. Иногда они также используют тот факт, что при вызове мы указываем, внутри какого класса они находятся. Это тоже нужно учесть в решении.

// При наследовании метод from создает экземляр наследуюемого класса class MyArray extends Array {} const a1 = MyArray.from("hello"); console.log(a1 instanceof MyArray); // Если вызвать метод from как обычную функцию, создается массив класса Array const {from} = Array; const a2 = from("hello"); console.log(a2 instanceof Array);

Подробнее про Array.from можно прочитать в соответствующем разделе Array.from() на MDN.