Использование шаблонов наследования в JavaScript
Из моего опыта JavaScript делает это:
- манипулирование DOM или другими хост-объектами
- добавление обработчиков событий
- делает Ajax
Поскольку я начал копаться в наследовании прототипов, я хотел бы знать, как оно на самом деле используется на практике. Каковы варианты использования?
Кто-нибудь здесь активно использует шаблоны наследования? Зачем?
(Я понимаю, что есть много ответов на мой вопрос - я просто хотел бы услышать некоторые из них, чтобы почувствовать использование наследования в JavaScript)
5 ответов
Мой опыт работы с jQuery (и JavaScript до него) показал, что наследование прототипов не так полезно, как я ожидал. Он имеет применение, но это не принципиально важно для языка.
В Javascript, если вы хотите вернуть объект с методом foo
:
return {
foo: function() {
alert('You called foo!');
}
};
И вызывающие абоненты могут рассматривать такие объекты как полиморфные - то есть они могут вызывать foo
не беспокоясь о том, что это за "тип" объекта. Нет необходимости в наследовании.
На этом фоне прототипы являются просто оптимизацией. Они позволяют создавать большое количество объектов без необходимости реплицировать большой набор свойств функции в каждом экземпляре. Вот почему jQuery использует его внутри. У объекта jQuery есть десятки функций, и копирование их в каждом экземпляре может оказаться сложной задачей.
Но с точки зрения пользователя jQuery, прототипы не особенно важны. Он может быть переписан, чтобы не использовать их, и он все равно будет работать (но может использовать гораздо больше памяти).
По мере того, как все больше и больше кода пишется специально для мобильных устройств под управлением iOS, Android, et.al и по мере развития парадигмы приложения, происходит сдвиг в сторону придания все большей сложности и логики библиотекам javascript, работающим на устройствах.
Модель объектов / наследования javascript предоставляет разработчику очень гибкий инструментарий для разработки динамических и сложных приложений.
Модель наследования JavaScript позволяет вам:
- расширить прототип (определение объекта) в любом месте вашего кода, даже после создания экземпляров объекта.
- Расширьте экземпляр прототипа отдельно от других экземпляров.
- Расширьте все встроенные объекты новыми функциями.
Это похоже на классовые и смешанные функции ruby и открывает массу новых шаблонов проектирования и наследования, из которых только немногие были изобретены или документированы.
jquery - лучший пример зрелой библиотеки javascript. текстовый прототип ссылки и scriptaculus другие.
У Дугласа Крокфорда есть несколько интересных статей о различном наследовании:
http://javascript.crockford.com/inheritance.html
http://javascript.crockford.com/prototypal.html
http://javascript.crockford.com/private.html
Первый - старый, и вы, возможно, не захотите ничего делать таким образом, но он показывает, насколько гибким может быть JavaScript. Второе - это то, как он использует прототипы. Последнее просто интересно, если вы собираетесь много использовать объекты в JavaScript, и в нем есть немного о наследовании.
Чтение их (они короткие) может не дать вам все ответы, которые вы хотите, но я подозреваю, что это заставит вас задуматься и увидеть JavaScript немного по-другому. Тем не менее, Крокфорд всегда очень уверен в своем письме, но я не думаю, что вы должны принять его слово как закон.
Вы должны взглянуть на код любой из больших библиотек, например, jQuery - он довольно широко используется в них.
Вероятно, лучший пример наследования, используемого в JavaScript, который я знаю, - это библиотека Ext. Вместо jQuery, который в основном является большим объектом, который сам расширяется, Ext демонстрирует более типичный подход к наследованию, встречающийся в программах, использующих объектно-ориентированные парадигмы.
Ext - это библиотека, которая состоит из множества настраиваемых объектов, которые можно использовать различными способами. Большинство объектов обобщены в абстрактные классы. Дайте ему посмотреть.
Средство существует уже давно, но тенденция к использованию ajax и более толстых клиентских веб-приложений означает, что оно становится все более распространенным, хотя обычно оно упаковано в используемые вами библиотеки.
Я играл с прототипом наследования и раньше, и использовал его экономно в какой-то работе во время моей работы на полную ставку. Полезно знать и хорошо обдумывать это, но на самом деле у меня не так много вариантов использования для этого изо дня в день.