Вопрос по javascript, oop – Является ли JavaScript объектно-ориентированным?

55

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

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

Потому что определение «объектно-ориентированного» не указывает ряд критериев для определения точного ответа Sklivvz
Я не думаю, что это субъективно. Он либо есть, либо его нет, либо есть конкретная причина, по которой он находится посередине. Почему вы считаете это субъективным? Eric Schoonover
я бы добавил «субъективный» тег Sklivvz
Я согласен со Sklivvz, что это субъективно, поскольку нет никаких полномочий, точно определяющих, какими характеристиками должен обладать язык прилагательное «объектно-ориентированный». AnthonyWJones
На этот вопрос было 11 ответов в течение 34 секунд после публикации - вау. micahwittman

Ваш Ответ

27   ответов
0

Клиентская библиотека Microsoft Ajax упрощает реализацию ОО в javascript. Он поддерживает унаследование и реализацию интерфейса.

0

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

0

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

24

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

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

3

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

0

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

Классы - это бухгалтерская конструкция. Объект не обязательно имеет ничего общего с объектами. ИМХО то, что делает объект, - это лямбда, пропущенная через край.
Правда, у javascript нет классов, достаточно справедливо, но объекты, которые вы создаете, являются приблизительными, по крайней мере, в отношении того, как вы взаимодействуете с ними.
когда была такая вещь, как классическая ООП. Что же тогда нового ООП ... смеется над мелодиями Metallica, не имея ни малейшего представления о том, что происходит, но хорошо проводя время? .... извините .... я очень, очень сильно связан ... :)
Javascript не имеет классов
0

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

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

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

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

0

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

1

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

Честно говоря, это шоу увековечило несколько искажений относительно JavaScript и стало причиной, по которой я задал этот вопрос здесь. Я хотел найти место, на которое я мог бы указать, когда в следующий раз кто-то заявил, что JavaScript не является объектно-ориентированным. ScottKoon
0

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

Error: User Rate Limit Exceeded
Классы - это бухгалтерская конструкция. Объект не обязательно имеет ничего общего с объектами. ИМХО то, что делает объект, - это лямбда, пропущенная через
Правда, у javascript нет классов, достаточно справедливо, но объекты, которые вы создаете, являются приблизительными, по крайней мере, в отношении того, как вы взаимодействуете с ними.
Какой бы у вас был весь идентификатор в правой части нового ключевого слова?
19

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededwhere it itself is definedError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededactError: User Rate Limit Exceeded
-1

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfacepalm
10

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

1

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

0

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

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

0

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

0

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

10

И да и нет.

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

Error: User Rate Limit Exceededjavascript.crockford.com/prototypal.html
36

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

ОтВикипедия:

JavaScript is heavily object-based. Objects are associative arrays, augmented with prototypes (see below). Object property names are associative array keys: obj.x = 10 and obj["x"] = 10 are equivalent, the dot notation being merely syntactic sugar. Properties and their values can be added, changed, or deleted at run-time. The properties of an object can also be enumerated via a for...in loop.

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

Статья очень полезна.
6

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

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

Error: User Rate Limit Exceeded
0

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

Я думаю, это зависит от того, какую традицию твой вкус ОО считает своим.
2

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

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

Вот изображение прототипов и функций, на которые я часто ссылаюсь

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

2

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

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

0

Is JavaScript object-oriented?

Answer : Yes

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

  • It does not have classes, but it does have constructors which do what classes do, including acting as containers for class variables and methods.
  • It does not have class-oriented inheritance, but it does have prototype-oriented inheritance.

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

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

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

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

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

8

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

Термин & # x201C; объектно-ориентированный & # x201D; был придуман Аланом Кейем в 1967 году, который объясняет это в 2003 году как

only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. (source)

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

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

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

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

Error: User Rate Limit Exceeded
53

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

Следующая характеристика будетencapsulation и это довольно легко сделать в Javascript.

Однако в сознании многих это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.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded ScottKoon
2

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

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

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

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

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

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

Очень наглядный пример: в главе 6 «Объектно-ориентированного JavaScript» quot; описывать10 manners to implement "inheritance". Сколько манер в Java? Один, а в C ++? Один, а в Delphi (Object Pascal)? Один, а в Objective-C? Один.

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

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

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

Anyway, in my opinion, JavaScript is a powerful language and the future in the client side layer!

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы