Объектно-ориентированные Javascript лучшие практики? [закрыто]


251

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

Ну, я использую объекты для создания библиотеки, но есть несколько способов определить вещи в JS, что подразумевает важные последствия в области видимости, управлении памятью, пространстве имен и т. Д. EG:

  • использовать varили нет;
  • определение вещей в файле или в (function(){...})()стиле jquery;
  • использовать thisили нет;
  • используя function myname()или myname = function();
  • определение методов в теле объекта или использование «прототипа»;
  • и т.п.

Итак, каковы действительно лучшие практики при кодировании в ОО в JS?

Академические объяснения действительно ожидаются здесь. Ссылки на книги горячо приветствуются, если они касаются качества и надежности.

РЕДАКТИРОВАТЬ :

Получил некоторые чтения, но я все еще очень заинтересован в ответах на вопросы выше и любые лучшие практики.


2
Возможно, «объектно-ориентированный» в заголовке следует заменить на «современный».
viam0Zah

43
Хммм, 79 голосов, 82 отзыва, 91 ответ на вопрос ... но это было закрыто как неконструктивно ... почему ??
Бретт Россье

1
Я написал простой класс, портирующий C ++ OOP Features на javascript с простым и естественным синтаксисом. Смотрите мой ответ здесь: stackoverflow.com/a/18239463/1115652

14
Этот тип вопроса всегда закрывается. Я понимаю причины этого, но так как они являются важными вопросами и всегда популярны (и поскольку я всегда нахожу их, когда у меня возникает похожий вопрос), мне интересно, может ли кто-нибудь направить нас в подходящее место для того, чтобы задать их?
КП МакГрегор

2
@BrettRossier Что хорошего в силе, если ты ею не владеешь? ТАК живая демонстрация того, как работает демократический порядок клевания. Конечно, некоторые психологи смотрят на это ...

Ответы:


288

Используя `var` или нет

Вы должны ввести любую переменную с varоператором, иначе она попадет в глобальную область видимости.

Стоит отметить, что в строгом mode ( "use strict";) присваиваются необъявленные переменныеReferenceError .

В настоящее время JavaScript не имеет блочной области видимости. Школа Крокфорда учит вас помещать операторы var в начало тела функции , а в Руководстве по стилю Dojo говорится, что все переменные должны быть объявлены в наименьшей возможной области видимости . ( letУтверждение и определение, введенные в JavaScript 1.7, не являются частью стандарта ECMAScript.)

Хорошей практикой является привязка свойств регулярно используемых объектов к локальным переменным, поскольку это быстрее, чем поиск всей цепочки областей видимости. (См. Оптимизация JavaScript для максимальной производительности и низкого потребления памяти .)

Определение вещей в файле или в `(function () {...}) ()`

Если вам не нужно выходить за пределы вашего кода, вы можете заключить весь код в выражение функции - это называется шаблоном модуля. Он имеет преимущества в производительности, а также позволяет минимизировать и скрыть ваш код на высоком уровне. Вы также можете убедиться, что он не будет загрязнять глобальное пространство имен. Функции переноса в JavaScript также позволяют добавлять аспектно-ориентированное поведение. У Бена Черри есть глубокая статья по шаблону модуля .

Используя `это` или нет

Если вы используете псевдоклассическое наследование в JavaScript, вы вряд ли сможете избежать его использования this. Это вопрос вкуса, какой тип наследования вы используете. В других случаях просмотрите статью Питера Мишо о виджетах JavaScript без «этого» .

Использование `function myname ()` или `myname = function ();`

function myname()является объявлением функции и myname = function();является выражением функции, назначенным переменной myname. Последняя форма указывает, что функции являются объектами первого класса, и вы можете делать с ними все, что угодно, как с переменной. Единственное различие между ними состоит в том, что все объявления функций поднимаются в верхнюю часть области, что может иметь значение в некоторых случаях. В противном случае они равны. function foo()это сокращенная форма. Более подробную информацию о подъеме можно найти в статье JavaScript Scoping and Hoisting .

Определение методов в теле объекта или использование «прототипа»

Тебе решать. JavaScript имеет четыре шаблона создания объектов: псевдоклассический, прототипный, функциональный и частичный ( Crockford, 2008 ). У каждого есть свои плюсы и минусы, посмотрите Крокфорда в его видео-выступлениях или получите книгу «Хорошие детали», как уже предлагал Анон .

Каркасы

Я предлагаю вам выбрать некоторые фреймворки JavaScript, изучить их соглашения и стиль и найти те практики и шаблоны, которые лучше всего вам подходят. Например, Dojo Toolkit предоставляет надежную среду для написания объектно-ориентированного кода JavaScript, который даже поддерживает множественное наследование.

Узоры

Наконец, есть блог, посвященный изучению общих шаблонов JavaScript и анти-шаблонов . Также проверьте вопрос Существуют ли какие-либо стандарты кодирования для JavaScript? в переполнении стека.


1
«У JavaScript есть четыре шаблона создания объектов: псевдоклассический, прототипный, функциональный и частичный», - я был бы очень признателен за краткое изложение плюсов и минусов здесь.
BadHorsie

2
« letЗаявление и определение, введенные в JavaScript 1.7, не являются частью стандарта ECMAScript». Теперь это часть ES6.
Михал Перлаковский

13

Я собираюсь записать некоторые материалы, которые я прочитал или положил в заявку, так как я задал этот вопрос. Таким образом, люди, читающие его, не будут разочарованы, так как большинство ответов замаскированы RTMF (даже если я должен признать, предлагаемые книги хороши).

Использование вар

Предполагается, что любая переменная уже объявлена ​​в более высокой области видимости в JS. Поэтому, когда вам понадобится новая переменная, объявите ее, чтобы избежать неприятных сюрпризов, таких как манипулирование глобальной переменной, не замечая ее. Поэтому всегда используйте ключевое слово var.

В объекте make переменная private является переменной var. Если вы хотите просто объявить публичную переменную, используйте this.my_var = my_valueдля этого.

Объявление методов

В JS это многочисленные способы объявления методов. Для программиста ОО наиболее естественным и эффективным способом является использование следующего синтаксиса:

Внутри тела объекта

this.methodName = function(param) {

/* bla */

};

Есть недостаток: внутренние функции не смогут получить доступ к «этому» из-за забавного объема JS. Дуглас Крокфорд рекомендует обойти это ограничение, используя обычную локальную переменную с именем «that». Так становится

function MyObject() {

    var that = this;

    this.myMethod = function() {

        jQuery.doSomethingCrazy(that.callbackMethod);

    };

};

Не полагайтесь на автоматический конец строки

JS пытается автоматически добавить ;в конце строки, если вы забудете об этом. Не полагайтесь на это поведение, так как вы получите ошибки, которые бесполезны для отладки.


8

Сначала следует прочитать о программировании на основе прототипов, чтобы вы знали, с каким зверем вы имеете дело, а затем взгляните на руководство по стилю JavaScript на странице MDC и страницу JavaScript на MDC . Я также считаю, что лучше всего повысить качество кода с помощью инструмента, т.е. JavaScript Lint или другие варианты.

Наилучшая практика со звуками ОО больше , как вы хотите , чтобы найти образцы , чем концентрат на качество кода, поэтому посмотреть на Google поиск: JavaScript узоры и узоры JQuery .


5

Возможно, вы захотите проверить секреты ниндзя JavaScript от Джона Резига (jQuery). «Эта книга предназначена для того, чтобы взять промежуточного разработчика JavaScript и дать ему знания, необходимые ему для создания кросс-браузерной библиотеки JavaScript с нуля».

Черновик доступен через издателя: http://www.manning.com/resig/

Дуглас Крокфорд также имеет несколько хороших статей о JavaScript на своей домашней странице: http://www.crockford.com/


5

Я часто чувствую себя единственным парнем, который использует MooTools для моего JavaScript.

Это означает M у O ▪ Таблица O riented Инструменты, MooTools.

Мне очень нравится их взятие на ООП в JavaScript. Вы можете использовать их реализацию класса вместе с jquery, так что вам не нужно отказываться от jquery (хотя mootools делает все это так же хорошо).

В любом случае, прочитайте первую ссылку и посмотрите, что вы думаете, вторая ссылка - на документы mootools.

MooTools & Inheritance

Классы MooTools


Я не думаю, что пытаться изогнуть язык, чтобы он подходил тебе, старый привычка - это хорошо. Это как люди в C, использующие # для замены, чтобы он выглядел как fortran, или иначе. Я думаю, что вы должны попытаться узнать, как работает язык (и его лучшие практики), и использовать его так, чтобы это вас не слишком беспокоило. Но не меняйте его, на самом деле.
e-Satun

2
Я думаю, что объектная система MooTools довольно элегантна и действительно помогает мне сохранять мой код организованным / инкапсулированным.
awesomo

0

Спасибо, но я не ищу основание. Я могу кодировать (грязный) работающий JS. Или, по крайней мере, большую часть времени :-) Мне нужны указания для написания того же кода, но правильно.
e-удовлетворительно
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.