Действительно ли JavaScript объектно-ориентирован?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
55
задан Gabi Purcaru 30 October 2010 в 18:44
поделиться

23 ответа

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

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

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

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

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

Редактирование : дополнительный вопрос поднят, "как делает prototypal инкапсуляцию жертвы наследования?" Рассмотрите этот пример non-prototypal approach:-

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

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

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

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

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

53
ответ дан hippietrail 26 November 2019 в 17:38
поделиться

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

-1
ответ дан Per Hornshøj-Schierbeck 26 November 2019 в 17:38
поделиться

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

0
ответ дан Peter Mortensen 26 November 2019 в 17:38
поделиться

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

0
ответ дан Peter Mortensen 26 November 2019 в 17:38
поделиться

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

0
ответ дан Vasil 26 November 2019 в 17:38
поделиться

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

0
ответ дан Rik 26 November 2019 в 17:38
поделиться

JavaScript не является объектно-ориентированным языком, как обычно рассмотрено, главным образом из-за отсутствия истинного наследования, УТИНЫЙ ввод допускает полуистинную форму наследования/полиморфизма наряду с обеспечением Object.prototype совместного использования комплексной функции. В его основе однако отсутствие наследования приводит к слабому полиморфизму для происхождения, так как УТИНЫЙ ввод настоит, что некоторый объект с теми же названиями атрибута является экземпляром Объекта, который они не были предназначены, чтобы использоваться как. Таким образом добавление атрибутов к случайному объекту преобразовывает основу их типа так сказать.

0
ответ дан bmeck 26 November 2019 в 17:38
поделиться

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

0
ответ дан matt lohkamp 26 November 2019 в 17:38
поделиться

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

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

0
ответ дан dsm 26 November 2019 в 17:38
поделиться

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

0
ответ дан mattlant 26 November 2019 в 17:38
поделиться

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

0
ответ дан Andrew Hedges 26 November 2019 в 17:38
поделиться

Microsoft Ajax Client Library делает простым реализовать OO в JavaScript. Это поддерживает inharitence и интерфейсную реализацию.

0
ответ дан urini 26 November 2019 в 17:38
поделиться

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

1
ответ дан Peter Mortensen 26 November 2019 в 17:38
поделиться

это хороший поток. Вот некоторые ресурсы, которые я люблю. Большинство людей начинает с прототипом, 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 ?

2
ответ дан Gene T 26 November 2019 в 17:38
поделиться

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

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

2
ответ дан Christian Davén 26 November 2019 в 17:38
поделиться

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

3
ответ дан CMS 26 November 2019 в 17:38
поделиться

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

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

6
ответ дан Sören Kuklau 26 November 2019 в 17:38
поделиться

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

термин “object-oriented” был введен Alan Kay в 1967, который объясняет его в 2003 для значения

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

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

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

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

Заключение: JavaScript объектно-ориентирован.

8
ответ дан elixenide 26 November 2019 в 17:38
поделиться

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

10
ответ дан munificent 26 November 2019 в 17:38
поделиться

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

19
ответ дан Eevee 26 November 2019 в 17:38
поделиться

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

Вот обсуждение статьи , как сделать OO в JavaScript.

24
ответ дан jop 26 November 2019 в 17:38
поделиться

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

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

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

кроме того, см. этот ряд статей об ООП с JavaScript.

36
ответ дан Eli Bendersky 26 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

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