Использование шаблонов наследования в 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 позволяет ты:

  • расширить прототип (определение объекта) в любом месте вашего кода, даже после экземпляров объект создан.
  • расширить экземпляр prototyp отдельно от других экземпляров.
  • расширить все встроенные объекты с новой функциональностью.

Это похоже на класс и функции mixin 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 и более толстым клиентским веб-приложениям означают, что он становится все более распространенным, хотя обычно упаковывается в библиотеках, которые вы используете.

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