30 декабря 2011 :Объекты, объекты-объекты; объекты? Объекты!Зомби зомби зомби. © Народная мудрость Developers! Developers! Developers! Developers! © Stiven Ballmer Речь в сегодняшней статье пойдёт в основном о яваскриптах, потому что именно их я преподаю сейчас стажёру нашей компании. Поэтому статья носит в основном методологический характер. Что такое объект?Поскольку яваскрипт, в Объект — Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа (например, после запуска результатов компиляции и связывания исходного кода на выполнение). Заметьте, в довольно простое определения навязали адресное пространство, компиляцию, классы и прототипы. Это всё равно что спросить что такое птица, а в ответ получить что это сущность употребимая в пищу и вылупляющаяся из яиц! Объект — некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеет заданные значения свойств (атрибутов) и операций над ними (методов). Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам, которые в свою очередь определяют поведение (являются моделью) объекта. Время с момента создания объекта (конструкция) до его уничтожения (деструкция) называется временем жизни объекта Я не читала таких определений, когда начала изучать яваскрипты, поэтому интуитивно они представляются совсем по другому. Это понятие класса должно строится на понятии объекта, а не понятие объекта строится на понятии класса. Объект — это сущность, которой можно посылать сообщения, и которая может на них реагировать, используя свои данные. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией. Опять таки. В определении говорится об инкапсуляции. А что если данные объекта не скрыты? В прочем поскольку моя статья про яваскрипты, данное определение вообще никакой смысловой нагрузки не несёт. Объект в программировании, это такая штука, которая не всегда может иметь визуальное представление, типа кнопки или поля. Скорее наоборот. Объект — это массив, который может содержать в качестве переменных, кроме всего прочего, функции или другие объекты. Такое определение я призываю запомнить стажёров, потому что это именно то, с чем мы работаем в яваскриптах. Справедливости ради, хочется так же отметить определение из англоязычной версии. Оно довольно хорошее. The programming construct that combines data with a set of methods for accessing and managing those data is called an object. © en.wikipedia.org Такой вариант так же допустим для запоминания. А теперь мне хочется рассказать почему яваскрипт это целиком Объекты в JavascriptТеперь внимание, дальше вы можете запутаться! В яваскриптах — почти всё является объектами, но не всё называется объектами. Число — или строковая переменная (или сущность) — не называются сами по себе объектами! Но по факту — являются ими. Например у числа или строки могут быть встроенные функции.
var a = 'te.st';
var b = a.split('.'); // в b - будет массив из значений te и st
Чтобы понять сказанное выше утверждение, приведу такой аналог: «насекомые и птицы — не называются животными, хотя по факту являются ими». Далее, небольшая тонкость касающаяся массивов. В яваскриптах есть названия для классов объектов — строка, число, массив и, внимание(!), Объект. Так и приходится писать объект объект. новый массив можно создать например как: в объект массива — [] — мы можем записывать только числовые, строковые и булевы переменные. Ну и другие массивы тоже. В объект Объекта — мы можем записывать то же самое + функции. Пример:
var a = {1,2,3, 'my_func': function(){ do_something; } };
Обращу внимание, что функция будет доступна как элемент массива: a['my_func'](); и как метод объекта a.my_func(); — в принципе равнозначно, как кому нравится. Теперь внимание — массив, может содержать индексы элементов, Индексы в записи Объекта пишут так index:value, однако это не подходит для записи массива (спасибо SelenIT в комментариях), поэтому запись a= [1:'something', 2:'something']; — НЕ верна Но можно создать такой объект
var a = {'вася':'Пупкин'};
и обращаться к нему как к массиву alert(a['вася'])); Подробнее об этом написано в моей статье «Javascript — работа с массивами и объектами» (09.2009). Теперь я расскажу о функциях. Функции — так же как и строки, и числа, и Объекты, являются в
function test(){
// do_something;
this.x = 5;
}
тогда a = test().x; // равно 5
функция при этом выполняется, и может
<script>
function test(){
// do_something;
alert('test');
this.x = 5;
}
a = test().x;
</script>
присвоит переменной число 5 — и покажет alert(). Ссылки на объектыВ заключение, мне хочется в очередной раз рассказать об одной особенности языка Javascript связанной с операцией присваивания. Когда происходит присвоение переменной строки, числа или логической переменной, это создаёт копию этого значения. В то время как присваивание переменной массива или объекта создаёт ссылку на это значение. Это вызывает путаницу, Пример:
Об этом, и о том как копировать объекты и массивы, так же написано в моей прошлой статье «Javascript — работа с массивами и объектами». P.S. Так же очень хочу сказать что Джон Ресиг (создатель jquery если кто не в курсе), недавно выступил с отличной и правильной идеей преподавания javascript в качестве первого языка программирования. Пожалуйста прочитайте его статью: Яваскрипт как первый язык программирования.В ней он так же затрагивает некоторые вопросы методологии, и как и я подчёркивает то, что в яваскриптах всё, включая функции является объектами. Цитирую:
С удовольствием выслушаю ваши замечания по теме. |
я буду очень признательна если вы прокоментируете эту статью
Чтобы оставить комментарий нужно зарегистрироваться или войти.
Либо волшебно используйте ваш логин в Google, Яндекс, рамблер или ЖЖ чтобы войти через Open_ID

Комментарии:
Алексей
30.12.2011 13:50:37
Елена Лунная
30.12.2011 14:33:50
Алексей
07.01.2012 11:17:31
Елена Лунная
07.01.2012 11:25:57
SelenIT
27.01.2012 03:43:57
SelenIT
27.01.2012 03:53:06
Елена Лунная
27.01.2012 05:45:32
SelenIT
27.01.2012 13:39:53
Елена Лунная
27.01.2012 20:54:07
SelenIT
27.01.2012 21:45:17
SelenIT
30.01.2012 18:10:35