Объекты JavaScript
Объекты.
первоисточник понимания http://karaboz.ru/?p=5
var <имя_объекта> = new <Тип_объекта> ('Привет мир');
Это типичный пример. Ключевые слова:
- var - создает локальную переменную, не принадлежащую объекту window
- new - создает новую область видимости, отличную от области видимости window.
Пример создания объектов разных типов:
var num = new Number(12345.6789); | var num = 12345.6789; |
var c = new Boolean(true); | var bul = true; |
var fun = new Function('x', 'var p = x'); | var fun = function(x){var p = x} |
var arr = new Array('a', 'b', 'c'); | var arr = ['a', 'b', 'c']; |
var obj = new Object(); | var obj = {}; |
Ограничения Следующий код показывает равенство двух переменных (объектов класса String):
var str1 = 'karaboz'; var str2 = new String('karaboz'); alert(str1 == str2); // выводит true
при попытке определить новый пользовательский метод для str1 мы получим ошибку:
str1.tell = function(){ alert(this);} str1.tell(); // выводит ошибку 'str1.tell is not a function'
При этом, для str2 все сработает, как мы и ожидаем:
str2.tell = function(){ alert(this);} str2.tell(); // выводит 'karaboz'
Это ограничение, наложенное JavaScript на переменные (объекты), созданные через строковые, числовые и булевы литералы, тем не менее, не распространяется на объекты, созданные через литералы функции, массива или объекта. Т.е. переменным (объектам), содержащим в себе функцию, или массив, или объект можно напрямую присваивать пользовательские свойства и методы:
var s = 'futurico'; // создаем новое свойство s объекта window (window.s) var f = function(){ // создаем новый метод f объекта window (window.f) alert(this == window); // выводит true alert(this.s); // выводит 'futurico' } f(); // вызываем метод f объекта window (window.f())
f.s = 'karaboz'; // создаем новое свойство s объекта window.f (window.f.s) f.m = function(){ // создаем новый метод m объекта window.f (window.f.m) alert(this == f); // выводит true alert(this.s); // выводит 'karaboz' } f.m(); // вызываем метод m объекта window.f (window.f.m())
Здесь мы наглядно убеждаемся, что функция f, созданная как метод глобального объекта window, сама оказывается объектом, у которого могут быть свои собственные свойства и методы!
Это ограничение, наложенное JavaScript на переменные (объекты), созданные через строковые, числовые и булевы литералы, тем не менее, не распространяется на объекты, созданные через литералы функции, массива или объекта. Т.е. переменным (объектам), содержащим в себе функцию, или массив, или объект можно напрямую присваивать пользовательские свойства и методы:
var s = 'futurico'; // создаем новое свойство s объекта window (window.s) var f = function(){ // создаем новый метод f объекта window (window.f) alert(this == window); // выводит true alert(this.s); // выводит 'futurico' } f(); // вызываем метод f объекта window (window.f())
f.s = 'karaboz'; // создаем новое свойство s объекта window.f (window.f.s) f.m = function(){ // создаем новый метод m объекта window.f (window.f.m) alert(this == f); // выводит true alert(this.s); // выводит 'karaboz' } f.m(); // вызываем метод m объекта window.f (window.f.m())
Здесь мы наглядно убеждаемся, что функция f, созданная как метод глобального объекта window, сама оказывается объектом, у которого могут быть свои собственные свойства и методы!
Вывод
Для того, что бы объект вел себя предсказуемо (это исключает долгую логическую отладку) объекты НАДО СОЗДАВАТЬ ТОЛЬКО ЯВНЫМ СПОСОБОМ
Своийства объекта
первоисточник для понимания http://javascript.ru/tutorial/object/intro
Пусть существует такой объект:
var stroka = new Object('Привет мир');
Добавим свойство объекту:
stroka.property ="Новое свойство объекта"
Удаление метода
delete
Методы объекта
Пусть существует такой объект:
var stroka = new String ('Привет мир');
Добавим этому объекту метод:
stroka.tell = function(){alert(this)}; //область видимости this указывает на объект, которому принадлежит данный метод
Вызовем этот метод:
stroka.tell(); //выведет Привет мир
Волшебная переменная arguments
Переменная, доступная внутри функции и содержащая аргументы и ссылку на саму функцию. Вы можете обращаться к аргументу по номеру, начиная от 0. При этом arguments содержит не объявленные, а реально переданные аргументы.
Следующий пример выведет реально переданные три аргумента, несмотря на то, что в функции их всего два.
function func(a,b) { alert(arguments[0]) alert(arguments[1]) alert(arguments[2]) } func(1,2,3)
Кроме цифровых индексов, у arguments есть свойство length, такое же как у массива.
Благодаря этому можно вызывать функции с переменным числом параметров. В следующем примере функция возвращает сумму всех аргументов.
Пример: сумма аргументов
function sum() { var s = 0 for(var i=0; i<arguments.length; i++) s += arguments[i] return s }
Несмотря на доступ по индексу и наличие свойства length, arguments не является массивом, т.е не принадлежит типу Array.
Поэтому для arguments нельзя напрямую вызвать методы этого класса:
arguments.pop() // ошибка !
Можно, однако, вызвать методы Array через apply/call:
var args = Array.prototype.slice.call(arguments)
Ссылка на функцию arguments.callee
Кроме аргументов, arguments содержит ссылку на выполняющуюся функцию.
Ее можно использовать для задания и чтения статических свойств.
В следующем примере для этого используется статическое свойство called.
Пример: подсчет количества выполнений
function func() { arguments.callee.called++ } func.called = 0; func() func() alert(func.called) // 2