Использование шаблонов наследования в 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 и более толстых клиентских веб-приложений означает, что оно становится все более распространенным, хотя обычно оно упаковано в используемые вами библиотеки.

Я играл с прототипом наследования и раньше, и использовал его экономно в какой-то работе во время моей работы на полную ставку. Полезно знать и хорошо обдумывать это, но на самом деле у меня не так много вариантов использования для этого изо дня в день.

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