Я изучаю JavaScript, и я исхожу из Java.
Разработчик Java может легко оценить полезность интерфейса, поскольку все известные классы реализации задокументированы. Пожалуйста, нажмите здесь, чтобы увидеть пример.
То же самое не верно в JavaScript. Например, для итерируемых объектов приведенные ниже ссылки показывают лишь несколько примеров итерируемых объектов. Они не показывают все реализации встроенных классов и классов DOM. (Например, они упомянули, что «типы коллекций, такие как NodeList, также являются итерируемыми». Итак, помимо NodeList, как я могу найти другие классы DOM, которые являются итерируемыми? Есть ли какой-нибудь код JS, который я могу запустить для этого? Спасибо!)
Как разработчик JavaScript находит реализующие классы интерфейса?
Спасибо!
То, что я ищу, это итерации, которые могут войти в первый аргумент Array.from(). Спасибо!
Новые классы, реализующие интерфейс, могут добавляться постоянно, а также добавляться пользовательским кодом. Так что любой список обязательно будет неполным.
Даже список, на который вы ссылаетесь, представляет собой только реализации в стандартных классах Java, он не включает реализации, добавленные сторонними библиотеками или написанным пользователем кодом.
New classes that implement the interface can be added all the time, as well as being added by user code. So any list will necessarily be incomplete. Привет @Barmar, мне не нужен полный список всех сторонних, внешних или пользовательских библиотек. Я надеюсь хотя бы узнать, какие стандартные встроенные интерфейсы и интерфейсы DOM (в es6 и es7) поддерживают итерации. Я предполагаю, что es6 и es7 меняются не так часто (как правило, новая версия выходит только раз в 10 лет).
Even the list you linked to is only implementations in the standard Java classes, it doesn't include implementations added by third party libraries or user-written code. Привет @Barmar, для моего колледжа они ожидают, что преподаватели будут знать только о стандартных занятиях. Они не ожидают, что преподаватели будут знать о сторонних библиотеках.
Привет всем, спасибо за все отзывы. Я преподаю курс по JavaScript. Одна из лекций посвящена методу Array.from(). Не зная, что входит в первый аргумент Array.from(), я не могу утверждать, что имею право преподавать эту тему.
Для этого не нужен исчерпывающий список. Примеров вещей достаточно.
JavaScript и DOM являются развивающимися стандартами. Даже встроенные типы будут меняться.
В заголовке вашего вопроса спрашивается «как», но тело снова спрашивает «какие другие классы DOM являются итерируемыми?» который дублирует ваш предыдущий вопрос.
Привет @Bergi, The title of your question asks "how", but the body is again asking "what other DOM classes are iterables? which duplicates your previous question, я изменил вопрос с "что" на "как". Пожалуйста, просмотрите. Спасибо!
К вашему сведению, Array.from() — это статический метод.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что ж, ближе всего к «интерфейсу», когда речь идет о встроенных классах, могут быть общеизвестные символы, которые говорят нам, реализует ли класс что-то:
Мы можем получить все свойства объекта globalThis (такие же, как объект Window в браузерах, разные в Node.js), большинство из которых являются классами, не перечислимы, поэтому мы должны использовать Object.getOwnPropertyNames.
Затем мы можем перебрать их и посмотреть, являются ли их прототипы итерируемыми — есть ли у них хорошо известный символ Symbol.iterator.
Теперь мы получим обширный список классов, которые создают итерируемые экземпляры.
function getIterableClasses() {
let classNames = [];
let builtIn = Object.getOwnPropertyNames(globalThis);
for (let x of builtIn) {
try {
let object = globalThis[x].prototype;
object[Symbol.iterator] && classNames.push(x);
}
catch (e) { }
}
return classNames.sort();
}
let c = getIterableClasses();
console.info('Found ' + c.length + ' iterable classes');
console.info(c.join('\n'));Этот код сообщает о 68 встроенных классах, которые создают итерируемые объекты в Chrome, 58 в Firefox и 57 в Safari (последние версии браузеров для Mac, 6 мая 2023 г.). Так что таких классов довольно много.
Примечание. В Node.js список намного меньше, поскольку он имеет более модульную структуру (модули требуются/импортируются при необходимости) и не имеет классов, связанных с DOM, но вы все равно получаете 19 различных классов с итерируемыми экземплярами в Node.js: Массив, BigInt64Array, BigUint64Array, Buffer, Float32Array, Float64Array, FormData, заголовки, Int16Array, Int32Array, Int8Array, Map, Set, String, URLSearchParams, Uint16Array, Uint32Array, Uint8Array, Uint8ClampedArray.
Личная мысль от одного преподавателя к другому: если ваша цель состоит в том, чтобы научить основам JavaScript, я думаю, вы окажете дурную услугу и себе, и своим ученикам, проходя все эти занятия. Лучше сосредоточьтесь на некоторых основах: массивы повторяемы, строки итерируемы, NodeLists (и как использовать querySelectorAll для получения NodeLists). И тот факт, что вы можете превратить любой итерируемый объект в массив, распространив его на массив [...iterable], часто бывает полезен, поскольку вы можете использовать для него стандартные методы массива (такие как map, filter, reduce).
Кроме того: распространение итерируемого объекта в массив [...iterable] делает примерно то же самое, что и Array.prototype.from, но более коротким, более «JS-несковым» способом.
Обновил ответ - нашел гораздо лучший угол - теперь я нахожу 68 встроенных классов, которые создают итерации - при запуске этого кода в Chrome попробуйте сами, нажав «Выполнить фрагмент кода».
Зачем использовать Object.create вместо прямого использования .prototype?
В чем смысл if (x === 'getIterableClasses'){continue;}?
@SolomonUcko: Хороший улов. Изменит мой код!
@Bergi: чтобы избежать бесконечного цикла, поскольку сама функция становится частью окна, если она запускается в консоли/глобальной области видимости (что является естественным местом для ее запуска) - но это было раньше, когда я использовал new, я думаю, что теперь это не нужно . Хороший улов! Удалим!
Исправлены и проголосовали за ваши комментарии @SolomonUcko и Bergi
Зачем вам нужно искать все реализующие классы? Пока он реализует интерфейс, вам больше ничего знать не нужно.