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