Объектно-ориентированные рекомендации Javascript?
Я нахожу, что я кодирую большой проект в Javascript. Я помню, что последнее было довольно приключением, потому что хакерский JS может быстро стать нечитаемым, и я хочу, чтобы этот код был чистым.
Ну, я использую объекты для создания lib, но есть несколько способов определить вещи в JS, подразумевая важные последствия в области, управлении памятью, пространстве имен и т.д. E.G:
- с помощью
var
или нет;
- определение элементов в файле или в стиле
(function(){...})()
, jQuery;
- с помощью
this
, или нет;
- с помощью
function myname()
или myname = function()
;
- определение методов в теле объекта или использование "prototype";
- и др.
Итак, каковы действительно лучшие методы при кодировании в OO в JS?
Академические объяснения действительно ожидаются здесь. Ссылка на книги тепло приветствуется, если они касаются качества и надежности.
ИЗМЕНИТЬ:
Получил некоторые показания, но мне все еще очень интересно ответы на вышеизложенные вопросы и любые лучшие практики.
Ответы
Ответ 1
Использование `var` или не
Вы должны ввести любую переменную с инструкцией var
, иначе она попадет в глобальную область.
Стоит отметить, что в строгом режиме ("use strict";
) необъявленные назначения переменных бросают ReferenceError
.
В настоящее время JavaScript не имеет области блока. Школа Crockford учит вас поместить инструкции var в начало тела функции, а Dojo Руководство по стилю читает, что все переменные должны быть объявлены в наименьшей возможной области. (let
инструкция и определение, введенные в JavaScript 1.7, не являются частью стандарта ECMAScript.)
Хорошей практикой является привязывать свойства регулярных объектов к локальным переменным, поскольку они быстрее, чем поиск всей цепочки областей видимости. (См. Оптимизация JavaScript для экстремальной производительности и низкого потребления памяти.)
Определение вещей в файле или в `(function() {...})()`
Если вам не нужно добираться до объектов вне вашего кода, вы можете обернуть весь свой код в выражении функции - он называется шаблоном модуля. Он имеет преимущества производительности, а также позволяет минимизировать и затенять код на высоком уровне. Вы также можете убедиться, что это не будет загрязнять глобальное пространство имен. Функции Wrapping в JavaScript также позволяют добавлять аспектно-ориентированное поведение. У Ben Cherry есть подробная статья о шаблоне модуля.
Использование `this` или не
Если вы используете псевдоклассическое наследование в JavaScript, вы вряд ли сможете избежать использования this
. Это вопрос вкуса, который вы используете для наследования. В других случаях проверьте статью Peter Michaux на JavaScript Widgets Without "this" .
Использование `function myname()` или `myname = function();`
function myname()
- это объявление функции, а myname = function();
- выражение функции, назначаемое переменной myname
. Последняя форма указывает, что функции являются первоклассными объектами, и вы можете делать с ними что угодно, как с переменной. Единственное различие между ними заключается в том, что все объявления функций поднимаются в верхнюю часть области, что может иметь значение в некоторых случаях. В противном случае они равны. function foo()
является сокращенной формой. Более подробную информацию о подъеме можно найти в статье JavaScript Scoping and Hoisting.
Определение методов в теле объекта или использование "prototype"
Это вам. JavaScript имеет четыре шаблона создания объекта: псевдоклассический, прототипный, функциональный и части (Crockford, 2008). У каждого есть свои плюсы и минусы, см. Крокфорд в своих видео-переговорах или получить его книгу The Good Parts как Анон уже предложил.
Каркасы
Я предлагаю вам поднять некоторые рамки JavaScript, изучить их соглашения и стиль, а также найти те методы и шаблоны, которые наилучшим образом подходят вам. Например, Dojo Toolkit предоставляет надежную структуру для написания объектно-ориентированного кода JavaScript, который даже поддерживает множественное наследование.
Шаблоны
Наконец, есть блог, посвященный изучить общие шаблоны JavaScript и анти-шаблоны. Также проверьте вопрос Есть ли какие-либо стандарты кодирования для JavaScript? в переполнении стека.
Ответ 2
Я собираюсь записать некоторые материалы, которые я читал или добавлял в приложение, так как я задавал этот вопрос. Таким образом, люди, читающие его, не расстраиваются, так как большинство ответов - это маскировка RTMF (даже если я должен признать, предлагаемые книги являются хорошими).
Использование Var
Любая переменная должна быть объявлена в более высокой области действия в JS. Поэтому, когда вам нужна новая переменная, объявите ее, чтобы избежать неприятных сюрпризов, например, манипулировать глобальным var, не замечая этого. Поэтому всегда используйте ключевое слово var.
В объекте make var var private. Если вы хотите просто объявить общедоступную переменную, используйте this.my_var = my_value
для этого.
Объявление методов
В JS они являются многочисленным способом объявления методов. Для программиста OO наиболее естественным и эффективным способом является использование следующего синтаксиса:
Внутри тела объекта
this.methodName = function(param) {
/* bla */
};
Существует недостаток: внутренние функции не смогут получить доступ к "this" из-за смешной области JS. Дуглас Крокфорд рекомендует обойти это ограничение, используя обычную локальную переменную с именем "that". Таким образом, он становится
function MyObject() {
var that = this;
this.myMethod = function() {
jQuery.doSomethingCrazy(that.callbackMethod);
};
};
Не полагайтесь на автоматический конец строки
JS пытается автоматически добавить ;
в конец строки, если вы его забудете. Не полагайтесь на это поведение, так как вы получите ошибки, которые нужно отладить.
Ответ 3
Сначала следует прочитать про прототип , чтобы вы знали, с каким зверем вы имеете дело, а затем взгляните на Руководство по стилю JavaScript в MDC и страница JavaScript в MDC. Я также считаю, что лучше всего использовать качество кода с помощью инструмента, т.е. JavaScript Lint или другие варианты.
Лучшие практики с OO звучат скорее как вы хотите найти шаблоны, чем сосредоточиться на качестве кода, поэтому посмотрите Поиск Google: шаблоны javascript и шаблоны jQuery.
Ответ 4
Вы можете проверить Секреты JavaScript ниндзя от Джона Ресига (jQuery). "Эта книга предназначена для того, чтобы взять промежуточного разработчика JavaScript и дать ему знания, необходимые ему для создания кросс-браузерной библиотеки JavaScript с нуля".
Проект доступен через издателя:
http://www.manning.com/resig/
У Дугласа Крокфорда также есть интересные статьи на его домашней странице:
http://www.crockford.com/
Ответ 5
Я часто чувствую себя единственным парнем, который использует MooTools для моего javascript.
Он обозначает M y O bject O, ориентированные инструменты, mootools.
Мне очень нравится, что они берут ООП в javascript. Вы можете использовать их реализацию класса вместе с jquery, так что вам не нужно вырезать jquery (хотя mootools делает все это так же хорошо).
В любом случае, дайте первой ссылке хорошее чтение и посмотрите, что вы думаете, вторая ссылка на документы mootools.
MooTools and Inheritance
Классы MooTools
Ответ 6
Здесь книга, которая охватывает большинство основ:
Объектно-ориентированный Javascript для высококачественных приложений и библиотек