Подтвердить что ты не робот

Является объектно-ориентированным JavaScript?

Были некоторые вопросы о том, является ли JavaScript объектно-ориентированным языком. Даже утверждение "только потому, что язык имеет объекты, не делает его OO".

Является ли JavaScript объектно-ориентированным языком?

4b9b3361

Ответ 1

IMO (и это всего лишь мнение) ключевая характеристика для ориентированного на объект языка будет заключаться в том, что она будет поддерживать polymorphism. Практически все динамические языки делают это.

Следующим признаком будет encapsulation, и это очень легко сделать в Javascript.

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

Javascript действительно предоставляет довольно простые средства для наследования реализации через прототипирование, но это за счет инкапсуляции.

Итак, если ваши критерии ориентации объектов - это классическая тройка полиморфизма, инкапсуляции и наследования, тогда Javascript не проходит.

Изменить. Добавлен дополнительный вопрос: "Как прототипное наследование жертвует инкапсуляцией?" Рассмотрим этот пример непрототипного подхода: -

function MyClass() {
    var _value = 1;
    this.getValue = function() { return _value; }
}

Атрибут _value инкапсулирован, он не может быть напрямую изменен внешним кодом. Мы могли бы добавить мутатор в класс, чтобы изменить его таким образом, который полностью контролируется кодом, который является частью класса. Теперь рассмотрим прототипный подход к тому же классу: -

function MyClass() {
  var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }

Хорошо, это сломано. Поскольку функция, назначенная getValue, больше не находится в области видимости с _value, она не может получить к ней доступ. Нам нужно будет повысить значение _value до атрибута this, но это сделает его доступным вне контроля кода, написанного для класса, поэтому инкапсуляция будет нарушена.

Несмотря на это, мой голос по-прежнему остается тем, что Javascript объектно ориентирован. Зачем? Поскольку данный OOD, я могу реализовать его в Javascript.

Ответ 2

Короткий ответ: Да. Для получения дополнительной информации:

От Wikipedia:

JavaScript сильно основан на объектах. Объектами являются ассоциативные массивы, дополненные прототипами (см. ниже). Имена свойств объекта являются ассоциативными ключи массива: obj.x = 10 и obj [ "x" ] = 10 эквивалентны, точечная нотация будучи просто синтаксическим сахаром. Свойства и их значения могут быть добавлен, изменен или удален время выполнения. Свойства объекта также можно перечислить через цикл.

Также см. эту серию статей об ООП с Javascript.

Ответ 3

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

Вот статья , в которой обсуждается, как делать OO в Javascript.

Ответ 4

Языки не должны вести себя точно так же, как Java, чтобы быть объектно-ориентированными. Все в Javascript - это объект; сравните с С++ или более ранней Java, которые в какой-то степени широко рассматриваются как объектно-ориентированные, но все же основаны на примитивах. Полиморфизм не является проблемой в Javascript, так как он вообще не заботится о типах. Единственной основной функцией OO, которая напрямую не поддерживается синтаксисом, является наследование, но это может быть легко реализовано, однако программист хочет использовать прототипы: здесь является одним такой пример.

Ответ 5

JavaScript является объектно-ориентированным, но не является объектно-ориентированным языком на основе классов, например Java, С++, С# и т.д. Языки ООП на основе классов являются подмножеством большего числа языков ООП, которые также включают в себя прототипы таких как JavaScript и Self.

Ответ 7

JavaScript - это язык программирования на основе прототипа (вероятно, язык сценариев на основе прототипов является более правильным определением). Он использует клонирование, а не наследование. Язык программирования на основе прототипа - это стиль объектно-ориентированного программирования без классов. В то время как объектно-ориентированные языки программирования стимулируют развитие внимания к таксономии и отношениям, языки программирования на основе прототипов поощряют сначала сосредоточиться на поведении, а затем классифицировать позже.

Термин "объектно-ориентированный" был придуман Аланом Кей в 1967 году, который объясняет это в 2003 году означающим

только обмен сообщениями, локальное удержание и защита и скрытие процесса состояния, а также крайняя поздняя привязка всех вещей. (источник)

В объектно-ориентированном программировании каждый объект способен принимать сообщения, обрабатывать данные и отправлять сообщения другим объектам.

Для языка, который должен быть объектно-ориентированным, могут включать функции как инкапсуляцию, модульность, полиморфизм и наследование, но это не является требованием. Объектно-ориентированные языки программирования, которые используют классы, часто упоминаются как языки программирования на основе классификации, но отнюдь не обязательно использовать классы для объектно-ориентированного программирования.

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

Вывод: JavaScript IS объектно-ориентированный.

Ответ 8

В отличие от большинства объектно-ориентированных языков, JavaScript (до ECMA 262 Edition 4, во всяком случае) не имеет понятия классов, но прототипов. Таким образом, это действительно несколько субъективно, следует ли называть его объектно-ориентированным или нет.

@eliben: Википедия говорит об объекте. Это не то же самое, что объектно-ориентированное. Фактически, их статья об объектно-ориентированном различает объектно-ориентированные языки и прототипы, явно вызывающие JavaScript, а не объектно-ориентированные.

Ответ 9

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

Ответ 10

Это, конечно, субъективный и академический вопрос. Некоторые люди утверждают, должен ли язык OO реализовывать классы и наследование, другие пишут программы, которые меняют вашу жизнь.; -)

(Но на самом деле, почему язык OO должен реализовывать классы? Я думаю, что объекты были ключевыми компонентами. Как вы их создаете, а затем использовать их - это другое дело.)

Ответ 11

это хорошая нить. Вот некоторые ресурсы, которые мне нравятся. Большинство людей начинают с прототипа, jquery или одного из лучших 6 libs (mootools, ExtJS, YUI), которые имеют разные объектные модели. Прототип пытается воспроизвести классический O-O, поскольку большинство людей думают об этом

http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/

Здесь изображение прототипов и функций, которые я называю много

http://www.mollypages.org/misc/js.mp?

Ответ 12

Я отвечаю на этот вопрос, подпрыгнув под другим углом.

Это вечная тема, и мы можем открыть пламенную войну на многих форумах.

Когда люди утверждают, что JavaScript является языком программирования OO, потому что они могут использовать OOD с этим, я спрашиваю: почему C не является языком программирования OO? Повторите, вы можете использовать OOD с C, и если вы сказали, что C является языком программирования OO, все будут говорить вам, что вы сумасшедшие.

Мы могли бы добавить здесь много ссылок на эту тему в очень старых книгах и форумах, потому что эта тема старше Интернета:)

JavaScript не менялся много лет, но новые программисты хотят показать, что JavaScript является языком программирования OO. Зачем? JavaScript является мощным языком, но не является языком программирования OO.

Язык программирования OO должен иметь объекты, метод, свойство, классы, инкапсуляцию, агрегацию, наследование и полиморфизм. Вы можете реализовать все эти моменты, но JavaScript не имеет их.

Очень иллюстрирующий пример: В главе 6 "Объектно-ориентированного JavaScript" описывается 10 манер для реализации "наследования". Сколько манер существует на Java? Один, а в С++? Один, и в Delphi (Object Pascal)? Один, а в Objective-C? Один.

Почему это другое? Поскольку Java, С++, Delphi и Objective-C разработаны с учетом ООП, но не для JavaScript.

Когда я был студентом (в 1993 году), в университете была типичная домашняя работа: выполните программу, разработанную с использованием OOD (Object-oriented design) с языком, отличным от OO. В то время выбранным языком был C (не С++). Цель этой практики заключалась в том, чтобы четко определить разницу между ООП и ООП и может различать ООП и языки, отличные от ООП.

В любом случае, это свидетельствует о том, что не все люди имеют некоторое мнение по этой теме:)

В любом случае, на мой взгляд, JavaScript - это мощный язык и будущее на клиентском уровне!

Ответ 13

Hanselminutes эпизод 146 рассматривает OO Ajax. Это было хорошее шоу и определенно хорошее шоу, чтобы помочь сформировать мнение.

Ответ 14

Misko Hevery сделал отличный вводный Tech Tech Tech, где он рассказывает об объектах в Javascript. Я нашел, что это хорошая отправная точка для людей, которые либо допрашивают использование объектов в Javascript, либо хотят начать с них:

Ответ 16

Я думаю, что многие люди отвечают на этот вопрос "нет", потому что JavaScript не реализует классы в традиционном смысле OO. К сожалению (IMHO), который входит в ECMAScript 4. До тех пор, viva la prototype!: -)

Ответ 17

Я думаю, что когда вы можете следовать тем же или похожим шаблонам дизайна, что и настоящий язык OO, такой как Java/С#, вы можете в значительной степени назвать его языком OO. Некоторые аспекты, очевидно, различны, но вы все равно можете использовать очень хорошо зарекомендовавшие себя ORO design pattersn.

Ответ 18

JavaScript основан на объектах, а не на объектно-ориентированном. Разница в том, что объектно-ориентированные языки не поддерживают надлежащее наследование, тогда как объектно-ориентированные.

Существует способ достижения "нормального" наследования в JavaScript (Ссылка здесь), но базовая модель основана на прототипировании.

Ответ 19

Все в javascript - это объект - классы - это объекты, функции - объекты, числа - объекты, объекты объектов объектов. Это не так строго, как печатать на других языках, но определенно можно написать OOP JS.

Ответ 20

Да, это так. Однако он не поддерживает все функции, которые можно было бы ожидать на объектно-ориентированном языке программирования, лишенном наследования и полиморфизма. Это не означает, однако, что вы не можете имитировать эти возможности через систему прототипирования, которая доступна для языка.

Ответ 21

Javascript не является объектно-ориентированным языком, как обычно считается, главным образом из-за отсутствия истинного наследования. DUCK-типизация позволяет полу-истинную форму наследования/полиморфизма наряду с Object.prototype, позволяющим осуществлять комплексное совместное использование функций. В основе всего этого, однако, отсутствие наследования приводит к слабому полиморфизму, который происходит после того, как команда DUCK будет настаивать на том, что какой-то объект с теми же именами атрибутов является экземпляром объекта, который они не предназначены для использования. Таким образом, добавление атрибутов к случайному объекту преобразует их базу типов в виде речи.

Ответ 22

Технически это прототип языка, но он легко для OO в нем.

Ответ 23

Объектно-ориентированный, но не основанный на классах, он основан на прототипах.

Ответ 24

Объекты в JavaScript наследуются непосредственно от объектов. Что может быть более объектно-ориентированным?

Ответ 25

Для меня лично главной привлекательностью программирования ООП является способность иметь автономные классы с неэкспонированными (частными) внутренними работами.

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

Даже если некоторые очень умные люди нашли обходные пути для этого, разве не странно, что Javascript в своей чистой форме требует создания кода, который очень нечитабелен?

Красота ООП заключается в том, что вы можете потратить свое время на размышления о своей логике приложений, не беспокоясь о синтаксисе.

Ответ 26

Является объектно-ориентированным JavaScript?

Ответ: Да

В нем есть объекты, которые могут содержать данные и методы, которые воздействуют на эти данные. Объекты могут содержать другие объекты.

  • У него нет классов, но он имеет конструкторы, которые выполняют какие классы, в том числе действуя как контейнеры для переменных класса и методов.
  • У него нет класс-ориентированного наследования, но он имеет ориентированное на прототип наследование.

Двумя основными способами построения объектных систем являются наследование (is-a) и агрегирование (has-a). JavaScript делает оба, но его динамическая природа позволяет ему превосходить при агрегации.

Некоторые утверждают, что JavaScript не является объектно ориентированным, потому что он не скрывает информацию. То есть объекты не могут иметь частные переменные и частные методы: все члены являются общедоступными.

Но оказывается, что Объекты JavaScript могут иметь частные переменные и частные методы. (Нажмите здесь, чтобы узнать, как это сделать.) Конечно, немногие понимают это, потому что JavaScript - это самый непонятный язык программирования в мире.

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

Источники: http://javascript.crockford.com/javascript.html

Ответ 27

Я бы сказал, что у него есть способности казаться OO. Особенно, если вы воспользуетесь его способностью создавать методы на существующем объекте (анонимные методы на некоторых языках). Клиентские библиотеки script, такие как jquery (jquery.com) или прототип (prototypejs.org), являются хорошими примерами библиотек, которые используют это, делая javascript очень симпатичным OO-подобным.