Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
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.
Я сказал бы, что это имеет возможности казаться OO. Особенно, если Вы используете в своих интересах, это - способность создать методы на существующем объекте (анонимные методы на некоторых языках). Библиотеки клиентского сценария как jQuery (jquery.com) или прототип (prototypejs.org) являются хорошими примерами библиотек, использующих в своих интересах это, заставляя JavaScript вести себя довольно подобные OO.
Объекты в JavaScript наследовались непосредственно объектам. Что может быть более объектно-ориентировано?
Да, это. Однако это не поддерживает все функции, которые можно было бы ожидать в недостающем наследовании объектно-ориентированного языка программирования и полиморфизме. Это не означает, однако, что Вы не можете моделировать эти возможности через систему разработки прототипа, которая доступна языку.
Это объектно-ориентировано, но не на основе классов, это основано на прототипах.
Технически это - язык прототипа, но легко к OO в нем.
JavaScript не является объектно-ориентированным языком, как обычно рассмотрено, главным образом из-за отсутствия истинного наследования, УТИНЫЙ ввод допускает полуистинную форму наследования/полиморфизма наряду с обеспечением Object.prototype совместного использования комплексной функции. В его основе однако отсутствие наследования приводит к слабому полиморфизму для происхождения, так как УТИНЫЙ ввод настоит, что некоторый объект с теми же названиями атрибута является экземпляром Объекта, который они не были предназначены, чтобы использоваться как. Таким образом добавление атрибутов к случайному объекту преобразовывает основу их типа так сказать.
Все в JavaScript - объект - классы являются объектами, функции являются объектами, числа являются объектами, объектами объектов объектов. Это не столь строго о вводе как другие языки, но определенно возможно записать ООП JS.
JavaScript Основан на объектах, не Объектно-ориентирован. Различие - то, что Основанные на объектах языки не поддерживают надлежащее наследование, тогда как Объектно-ориентированные делают.
существует способ достигнуть 'нормального' наследования в JavaScript ( Ссылка здесь ), но базовая модель основана на разработке прототипа.
Я думаю, когда можно следовать тем же или подобным шаблонам разработки как истинный язык OO как Java/C#, можно в значительной степени назвать его языком OO. Некоторые аспекты очевидно отличаются, но можно все еще использовать, очень хорошо установил шаблоны дизайна OO.
Я думаю, что много людей отвечает на этот вопрос "нет", потому что JavaScript не реализует классы в традиционном смысле OO. К сожалению (по моему скромному мнению), это прибывает в ECMAScript 4. До тех пор, виват la прототип!:-)
Microsoft Ajax Client Library делает простым реализовать OO в JavaScript. Это поддерживает inharitence и интерфейсную реализацию.
Эпизод 146 Hanselminutes смотрит на Ajax OO. Это было хорошее шоу и определенно хорошее шоу, чтобы помочь сформировать мнение.
это хороший поток. Вот некоторые ресурсы, которые я люблю. Большинство людей начинает с прототипом, jQuery, или один из лучших 6 освобождает (mootools, ExtJS, YUI), которые имеют различные объектные модели. Прототип пытается копировать классический O-O, поскольку большинство людей думает о нем
, http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/
Вот является изображением прототипов и функций, к которым я обращаюсь много
Это, конечно, субъективно и академический вопрос. Некоторые люди спорят, должен ли язык OO реализовать классы и наследование, другие пишут программы, которые изменяют Вашу жизнь.;-)
(Но действительно, почему языку OO придется реализовать классы? Я думал бы , объекты были ключевыми компонентами. То, как Вы создаете и затем используете их, является другим вопросом.)
JavaScript является очень хорошим языком для записи объектно-ориентированных веб-приложений. Это может поддерживать ООП потому что наследование поддержек посредством разработки прототипа также свойств и методов. У Вас могут быть полиморфизм, инкапсуляция и много парадигм разделения на подклассы.
В отличие от большинства объектно-ориентированных языков, JavaScript (перед выпуском 4 ECMA 262, так или иначе) не имеет никакого понятия классов, но прототипов. По сути, это действительно несколько субъективно, назвать ли его объектно-ориентированным или нет.
@eliben: Википедия говорит, что объект - базировался . Это не то же как объектно-ориентированное. На самом деле их статья об основанном на объектах различает объектно-ориентированные языки и основанные на прототипе, явно называя JavaScript не объектно-ориентированным.
JavaScript является основанным на прототипе языком программирования (вероятно, основанный на прототипе язык сценариев является более корректным определением). Это использует клонирование и не наследование. Основанный на прототипе язык программирования является стилем объектно-ориентированного программирования без классов. В то время как языки объектно-ориентированного программирования поощряют внимание разработки на таксономию и отношения, основанные на прототипе языки программирования поощряет, чтобы сфокусироваться на поведении сначала и затем позже классифицировать.
термин “object-oriented” был введен Alan Kay в 1967, который объясняет его в 2003 для значения
только обмен сообщениями, локальное хранение и защита и сокрытие процесса состояния и экстремальное позднее связывание всех вещей. <глоток> (источник) глоток>
В объектно-ориентированном программировании, каждый объект способен к получению сообщений, обработке данных и отправке сообщений к другим объектам.
Для языка, чтобы быть объектно-ориентированным в может включать функции как инкапсуляцию, модульный принцип, полиморфизм и наследование, но это не требование. Языки объектно-ориентированного программирования, которые используют классы, часто упоминаются, как классифицируется - базирующиеся языки программирования, но это ни в коем случае не необходимость для использования классов, чтобы быть объектно-ориентированным.
JavaScript использует прототипы для определения свойств объектов, включая методы и наследование.
Заключение: JavaScript объектно-ориентирован.
JavaScript объектно-ориентирован, но не основан на классах объектно-ориентированный язык как Java, C++, C#, и т.д. Основанные на классах языки ООП являются подмножеством более многочисленной семьи языков ООП, которые также включают основанные на прототипе языки как JavaScript и Сам.
Да и нет.
JavaScript, как Douglas Crockford выражается, " самый недооцененный язык программирования в мире ". У него есть [приблизительно 111] большие статьи о JavaScript, который я настоятельно рекомендовал бы читать на том, каков точно JavaScript. Это имеет больше общего с LISP тот C++.
Языки не должны вести себя точно как Java, чтобы быть объектно-ориентированными. Все в JavaScript - объект; сравните с C++ или более ранним Java, которые широко считают объектно-ориентированными до некоторой степени, но все еще на основе примитивов. Полиморфизм является надуманным вопросом в JavaScript, поскольку это не очень заботится о типах вообще. Единственной базовой функцией OO, не непосредственно поддерживавшей синтаксисом, является наследование, но это может легко быть реализовано однако, программист хочет использовать прототипы: здесь один такой пример.
JavaScript является языком мультипарадигмы, который поддерживает процедурные, объектно-ориентированные стили (основанного на прототипе) и функционального программирования.
Вот обсуждение статьи , как сделать OO в JavaScript.
Короткий ответ - Да. Для получения дополнительной информации:
От Википедия :
JavaScript в большой степени основан на объектах. Объекты являются ассоциативными массивами, увеличенными с прототипами (см. ниже). Имена свойства объекта являются ключами ассоциативного массива: obj.x = 10 и obj ["x"] = 10 эквивалентны, запись через точку, являющаяся просто синтаксическим сахаром. Свойства и их значения могут быть добавлены, изменены или удалены во времени выполнения. Свойства объекта могут также быть перечислены через для... в цикле.
кроме того, см. этот ряд статей об ООП с JavaScript.