Loading
Красноглазым Джедаям
компьютерной вселенной
посвящается.

Объекты в JavaScript

Для начала о типах данных. Данные делятся на константы == литералы и изменяемые == объекты. Константы нельзя переопределять. Например символу А нельзя назначить символ В. Литералы делятся на числа и строки.

  1. Числа: 0-9 (10 символов) + A-Z (26 символов) = итого 36 символов. Попробуйте вызвать parseInt(Z, "36").
  2. Строки: наборы символов, пробелы , знаки препинания и т.п..

Изменяемые == объекты делятся на встроенные и создаваемые. Но независимо от способа появления они представляют из себя именованные(хэшированные) массивы.

На красный едет тот, у кого много "зелёных".

Хешированные массивы.

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

В отличие от Хэша, обычный массив в качестве ключей использует целые числа и считается упорядоченным по возрастанию этих чисел. Его длина length будет равна количеству элементов в массиве. И в общем это тоже объект! но класса Array, со всеми определенными этому встроенному классу свойствами и методами.

Синтаксис для доступа к свойствам и методам как элементам массива Хэш

var arr=new Array(); arr["key"]="value"; //доступ как к типу данных - анализируется и может изменяться alert(arr["key"]); //как часть текста программы - не анализируется и не может изменяться alert(arr.key); //числовое имя свойства работать не будет! arr.0 //а как имя индекса массива работать будет. arr[0];

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

//Свойство var prop = 'Переменная'; alert(window.prop); //Метод function myFun(){alert('Hello!')} window.myFun();

Способы создания объектов

Конструктор объекта

var obj = new Object(); obj.first = "свойство объекта"; obj["second"] = function(arg){код функции};//метод объекта obj.prototype.third = "свойство класса"; this.forth = "тоже свойство класса";//сработает на вызывающем объекте см. this

Объектный литерал

var obj = { first:"первое свойство", second:function(arg){код функции}, third:{a:"свойство1", b:function(arg){код функции}} }

Удаление свойств объектов производится командой delete my_obj.my_property;

Итак в JavaScript все есть объекты!

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

Ну первое, что приходит на ум

document.write = function(arg){alert(arg)} document.write("Hello!");

Понятно, что так делать бессмысленно, но принцип, надеюсь, понятен.

Прототипирование

Прототипирование добавляет свойства и методы для вызывающих объектов. По способу получения объектом свойств чем то похоже на this. Но есть одно важнейшее отличие. This будет ссылаться на вызывающий объект, то есть свойство будет СКОПИРОВАНО в объект. Прототип это промежуточный объект, который является свойством любой функции и содержит по умолчанию только одно свойство - "constructor"- оно ссылается на нашу функцию, но если определить в функции ряд свойств и методов, то они будут содержаться в прототипе, то есть прототип НАСЛЕДУЕТ свойства.

This определяет свойства и методы конкретного вызывающего объекта, а prototype определяет свойства и методы всех всех вызывающих объектов, имеющих одинаковые свойства и методы, заданные нашей текущей ФУНКЦИЕЙ-конструктором и сохраненные в объекте - прототипе.

Итак прототипирование позволяет задавать свойства и методы для классов объектов, а не для объектов! А если быть более точным, то поскольку javascript не знает что такое классы, то при помощи прототипирования можно имитировать классы.

//свойство будет СКОПИРОВАНО в экземплер класса var myFun=function(){this.name="моя функция";} //свойство будет УНАСЛЕДОВАНО экземплером класса myFun.prototype.property1="property1_value"; //создаем экземплер класса var myFun1=new myFun(); //Выведет "моя функция" alert(myFun1.name); //Выведет "property1_value" alert(myFun1.property1);

Пока все одинаково. Результат не позволяет понять разницу между копированием и наследованием свойств. Попробуем присвоить объекту window свойство через this.

//Выведет "Имя окна" window.name = ''; function myFun(){this.name="Имя окна";} window.myFun(); alert(window.name);

Объект window получает свойство. Оно СКОПИРОВАНО в вызывающий объект. Теперь пробуем присвоить объекту window свойство через prototype, то есть наследование.

//Выведет пустое сообщение window.name = ''; function myFun(){myFun.prototype.name="Имя окна_1";} window.myFun(); alert(window.name);

Объект window не получает свойство. Глобальный объект window (то есть находящийся на самой верхней ступени иерархии объектов документа) не является экземплером класса myFun и не может УНАСЛЕДОВАТЬ свойство. Причина в том, что в случае прототипирования нужно создать экземплер класса, который унаследует свойства. Создадим экземплер с именем test.

//Выведет "Имя 1" function myFun(){myFun.prototype.name="Имя 1";} var test = new myFun(); alert(test.name);

Test как экземплер класса myFun УНАСЛЕДОВАЛ свойство name. Оператор new автоматически создает ссылку на промежуточный объект - прототип. Подведем некоторые итоги:

Прототипирование позволяет реализовать наследование свойств классов. То есть создаем первый класс, потом создаем второй класс и ему наследуем свойства и методы первого класса. Потом создаем экземплер класса = объект и распечатываем его свойства командой alert.

function one(){one.prototype.name = "имя";} function two(){two.prototype.surname = "фамилия";} two.prototype = new one(); three = new two(); alert(three.name+" и "+three.surname);


Контактная информация

E-Mail: oleynikww@gmail.com

Добавить комментарий

Комментарии пользователей