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


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

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

27 55

27 ответов:

ИМО (и это только мнение)the ключевой характеристикой объектно-ориентированного языка будет то, что он будет поддерживать полиморфизм. Почти все динамические языки делают это.

следующая характеристика будет инкапсуляция и это довольно легко сделать в JavaScript.

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

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

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

Edit: дополнительный возникает вопрос: "как прототипное наследование жертвует инкапсуляцией?"Рассмотрим такой пример не прототипичный подход:-

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 является объектно-ориентированным. Зачем? Потому что дано УД Я могу реализовать его в Javascript.

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

с Википедия:

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

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

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

здесь статьи обсуждение того, как сделать OO в Javascript.

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

да и нет.

JavaScript-это, как выразился Дуглас Крокфорд,"самый непонятый язык программирования в мире.- У него есть кое-что отличные статьи на JavaScript что я настоятельно рекомендую прочитать о том, что такое JavaScript. Он имеет больше общего с LISP, что C++.

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

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

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

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

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

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

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

вывод: JavaScript является объектно-ориентированным.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Почему это разные? Потому что Java, C++, Delphi и Objective-C разработаны с учетом ООП, но не JavaScript.

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

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

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

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

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

The Клиентская Библиотека Microsoft Ajax делает его простым для реализации ОО в JavaScript. Он поддерживает нечеткость и реализацию интерфейса.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ : Да

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

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

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

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

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

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

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

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