Я предпочитаю использовать ООП в крупных проектах, таких как тот, над которым я сейчас работаю. Мне нужно создать несколько классов в JavaScript, но, если я не ошибаюсь, есть по крайней мере несколько способов сделать это. Каков будет синтаксис и почему это будет сделано таким образом?
Я хотел бы избежать использования сторонних библиотек - по крайней мере, на первых порах.
В поисках других ответов я нашел статью « Объектно-ориентированное программирование на JavaScript», часть I: Наследование - Doc JavaScript, в которой обсуждается объектно-ориентированное программирование на JavaScript. Есть ли лучший способ сделать наследство?
javascript
oop
class
Karim
источник
источник
Ответы:
Вот способ сделать это без использования каких-либо внешних библиотек:
Теперь реальный ответ намного сложнее, чем этот. Например, в JavaScript нет такого понятия, как классы. JavaScript использует
prototype
схему наследования на основе.Кроме того, существует множество популярных библиотек JavaScript, которые имеют собственный стиль аппроксимации классоподобных функций в JavaScript. Вы захотите проверить хотя бы Prototype и jQuery .
Решить, какой из них «лучший», - отличный способ начать священную войну с переполнением стека. Если вы начинаете большой JavaScript-проект, то определенно стоит изучить популярную библиотеку и делать это по-своему. Я опытный парень, но Stack Overflow, похоже, склоняется к jQuery.
Поскольку существует только «один способ сделать это», без каких-либо зависимостей от внешних библиотек, то, как я написал, в значительной степени так.
источник
Лучший способ определить класс в JavaScript - это не определять класс.
Шутки в сторону.
Существует несколько разновидностей объектно-ориентированных, некоторые из них:
И, вероятно, другие, о которых я не знаю.
JavaScript реализует ОО на основе прототипов. В ОО на основе прототипов новые объекты создаются путем копирования других объектов (вместо создания экземпляров из шаблона класса), а методы живут непосредственно в объектах, а не в классах. Наследование осуществляется посредством делегирования: если у объекта нет метода или свойства, он проверяется на его прототипах (то есть на объекте, из которого он был клонирован), затем на прототипах прототипа и так далее.
Другими словами: нет классов.
У JavaScript на самом деле есть хорошая настройка этой модели: конструкторы. Вы можете не только создавать объекты путем копирования существующих, но и создавать их, так сказать, «из воздуха». Если вы вызываете функцию с
new
ключевым словом, эта функция становится конструктором, иthis
ключевое слово будет указывать не на текущий объект, а на вновь созданный «пустой» объект. Таким образом, вы можете настроить объект так, как вам нравится. Таким образом, конструкторы JavaScript могут взять на себя одну из ролей классов в традиционной ОО на основе классов: выступать в качестве шаблона или проекта для новых объектов.Теперь, JavaScript очень мощный язык, поэтому довольно легко реализовать класс на основе системы OO внутри JavaScript , если вы хотите. Тем не менее, вы должны делать это только в том случае, если вам это действительно нужно, а не только потому, что так делает Java.
источник
ES2015 Классы
В спецификации ES2015 вы можете использовать синтаксис класса, который является просто сахаром над системой-прототипом.
Льготы
Основное преимущество заключается в том, что инструментам статического анализа легче ориентироваться на этот синтаксис. Для других, приходящих из языков классов, также проще использовать этот язык как полиглот.
Предостережения
Будьте осторожны с его текущими ограничениями. Чтобы получить частные свойства, нужно прибегнуть к использованию Symbols или WeakMaps . В будущих выпусках классы, скорее всего, будут расширены для включения этих отсутствующих функций.
Служба поддержки
Поддержка браузеров в настоящее время не очень хороша (поддерживается почти всеми, кроме IE), но вы можете использовать эти функции сейчас с таким транспайлером, как Babel .
Ресурсы
источник
Я предпочитаю использовать Даниэля X. Мура
{SUPER: SYSTEM}
. Это дисциплина, которая обеспечивает такие преимущества, как истинные переменные экземпляра, наследование на основе признаков, иерархии классов и параметры конфигурации. Пример ниже иллюстрирует использование истинных переменных экземпляра, что, я считаю, является самым большим преимуществом. Если вам не нужны переменные экземпляра и вас устраивают только публичные или приватные переменные, возможно, существуют более простые системы.Ничего себе, это не очень полезно само по себе, но взгляните на добавление подкласса:
Еще одним преимуществом является возможность иметь модули и наследование на основе признаков.
Пример наличия класса person включает в себя связываемый модуль.
Раскрытие: я Даниэль X. Мур, и это мое
{SUPER: SYSTEM}
. Это лучший способ определить класс в JavaScript.источник
источник
Ниже приведены способы создания объектов в JavaScript, которые я использовал до сих пор.
Пример 1:
Пример 2:
Пример 3:
Пример 4: Фактические преимущества Object.create (). пожалуйста, обратитесь [эту ссылку]
Пример 5 (настроенный Crockford's Object.create):
Чтобы держать ответ в курсе ES6 / ES2015
Класс определяется так:
источник
Я думаю, вам следует прочитать прототипное наследование Дугласа Крокфорда в JavaScript и классическое наследование в JavaScript .
Примеры с его страницы:
Эффект? Это позволит вам добавлять методы более элегантным способом:
Я также рекомендую его видео: Расширенный JavaScript .
Вы можете найти больше видео на его странице: http://javascript.crockford.com/ В книге Джона Рейсига вы найдете много примеров с сайта Дугласа Крокфора.
источник
'strings'
именами многих вещей, но элегантность - не одно из них ...Потому что я не допущу план фабрики YUI / Crockford и потому что мне нравится держать вещи самодостаточными и расширяемыми, это мой вариант:
где в идеале тест typeof находится на чем-то похожем на первый прототип метода
источник
Если вы идете по простому, вы можете полностью избежать «нового» ключевого слова и просто использовать фабричные методы. Иногда я предпочитаю это, потому что мне нравится использовать JSON для создания объектов.
Я не уверен, что производительность падает для больших объектов, хотя.
источник
Именно так TypeScript компилирует класс с конструктором в JavaScript.
источник
Простой способ:
Причина в
that
том, что этоthis
может быть связано с чем-то другим, если вы дадите метод в качестве обработчика события, поэтому вы сохраните значение во время создания экземпляра и будете использовать его позже.Изменить: это определенно не лучший способ, просто простой способ. Я тоже жду хороших ответов!
источник
Вы, вероятно, хотите создать тип, используя шаблон сворачивания:
Этот код даст вам тип с именем myType . Он будет иметь внутренние приватные поля, называемые toggle и text . Он также будет иметь эти открытые элементы: поля подсчитывают и номер ; свойства toggle , text и numberLength ; методы incrementNumbersByCount и настройки .
Шаблон сворачивания полностью детализирован здесь: Шаблон сворачивания Javascript
источник
Код гольф для ответа @ liammclennan .
источник
MooTools (My Object-Oriented Tools) сосредоточен на идее классов . Вы даже можете расширить и реализовать с наследованием.
Когда освоено, это делает для смешно многоразового, мощного JavaScript.
источник
Классы на основе объектов с наследованием
Просто, сладко, и готово.
источник
База
Класс
действие
источник
На примере Триптиха это может быть даже проще:
Это создает только один экземпляр объекта, но все еще полезно, если вы хотите инкапсулировать кучу имен для переменных и методов в классе. Обычно в конструкторе не было бы аргументов «Bob, M», например, если методы были бы вызовами системы с ее собственными данными, такими как база данных или сеть.
Я все еще слишком новичок в JS, чтобы понять, почему это не используется
prototype
.источник
JavaScript является объектно-ориентированным , но он радикально отличается от других языков ООП, таких как Java, C # или C ++. Не пытайтесь понять это так. Выкинь это старое знание и начни заново. JavaScript нуждается в другом мышлении.
Я бы посоветовал получить хорошее руководство или что-то по этому вопросу.
Я сам нашел ExtJS Tutorials лучшим для меня, хотя я не использовал фреймворк ни до, ни после прочтения. Но это дает хорошее объяснение того, что есть в мире JavaScript.Извините, похоже, что этот контент был удален. Вот ссылка на копию archive.org вместо этого. Работает сегодня. :Писточник
источник