Как разработчик JavaScript находит реализующие классы интерфейса?

Я изучаю JavaScript, и я исхожу из Java.

Разработчик Java может легко оценить полезность интерфейса, поскольку все известные классы реализации задокументированы. Пожалуйста, нажмите здесь, чтобы увидеть пример.

То же самое не верно в JavaScript. Например, для итерируемых объектов приведенные ниже ссылки показывают лишь несколько примеров итерируемых объектов. Они не показывают все реализации встроенных классов и классов DOM. (Например, они упомянули, что «типы коллекций, такие как NodeList, также являются итерируемыми». Итак, помимо NodeList, как я могу найти другие классы DOM, которые являются итерируемыми? Есть ли какой-нибудь код JS, который я могу запустить для этого? Спасибо!)

Как разработчик JavaScript находит реализующие классы интерфейса?

Спасибо!

Документация MDN по итерируемым объектам:

Обновление 1:

То, что я ищу, это итерации, которые могут войти в первый аргумент Array.from(). Спасибо!

Зачем вам нужно искать все реализующие классы? Пока он реализует интерфейс, вам больше ничего знать не нужно.

Barmar 05.05.2023 23:36

Новые классы, реализующие интерфейс, могут добавляться постоянно, а также добавляться пользовательским кодом. Так что любой список обязательно будет неполным.

Barmar 05.05.2023 23:37

Даже список, на который вы ссылаетесь, представляет собой только реализации в стандартных классах Java, он не включает реализации, добавленные сторонними библиотеками или написанным пользователем кодом.

Barmar 05.05.2023 23:39
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 лет).
Arial 06.05.2023 00:12
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, для моего колледжа они ожидают, что преподаватели будут знать только о стандартных занятиях. Они не ожидают, что преподаватели будут знать о сторонних библиотеках.
Arial 06.05.2023 00:17

Привет всем, спасибо за все отзывы. Я преподаю курс по JavaScript. Одна из лекций посвящена методу Array.from(). Не зная, что входит в первый аргумент Array.from(), я не могу утверждать, что имею право преподавать эту тему.

Arial 06.05.2023 00:18

Для этого не нужен исчерпывающий список. Примеров вещей достаточно.

Barmar 06.05.2023 00:19

JavaScript и DOM являются развивающимися стандартами. Даже встроенные типы будут меняться.

Barmar 06.05.2023 00:20

В заголовке вашего вопроса спрашивается «как», но тело снова спрашивает «какие другие классы DOM являются итерируемыми?» который дублирует ваш предыдущий вопрос.

Bergi 06.05.2023 05:03

Привет @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, я изменил вопрос с "что" на "как". Пожалуйста, просмотрите. Спасибо!

Arial 06.05.2023 20:29

К вашему сведению, Array.from() — это статический метод.

InSync 07.05.2023 21:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
11
191
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, ближе всего к «интерфейсу», когда речь идет о встроенных классах, могут быть общеизвестные символы, которые говорят нам, реализует ли класс что-то:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#well-known_symbols

Мы можем получить все свойства объекта 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 попробуйте сами, нажав «Выполнить фрагмент кода».

Thomas Frank 06.05.2023 04:43

Зачем использовать Object.create вместо прямого использования .prototype?

Solomon Ucko 06.05.2023 04:59

В чем смысл if (x === 'getIterableClasses'){continue;}?

Bergi 06.05.2023 05:06

@SolomonUcko: Хороший улов. Изменит мой код!

Thomas Frank 06.05.2023 05:10

@Bergi: чтобы избежать бесконечного цикла, поскольку сама функция становится частью окна, если она запускается в консоли/глобальной области видимости (что является естественным местом для ее запуска) - но это было раньше, когда я использовал new, я думаю, что теперь это не нужно . Хороший улов! Удалим!

Thomas Frank 06.05.2023 05:11

Исправлены и проголосовали за ваши комментарии @SolomonUcko и Bergi

Thomas Frank 06.05.2023 05:15

Другие вопросы по теме

Похожие вопросы