Итак, начну-ка я, пожалуй, свою серию статей, посвященных javascript. По результатам опросов, некоторые люди, желающие освоить javascript, имеют о нем слабое представление, поэтому первые несколько статей будут посвящены достаточно базовым вещам. Если вы — крутой js программер, написали уже стопиццот веб-приложений, то вам, скорее всего, эти статьи будут не интересны.
Для начала определим инструментарий: при разработке веб-приложений я пользуюсь фреймворком
mootools, поэтому все мои примеры будут основаны именно на нем. Мой выбор основан, скорее, личным предпочтением. Для справки, mootools используется в таких системах, как Joomla (версии 1.5.), валидатор HTML w3c,
vimeo. Еще вам понадобится Firefox с установленным на него аддоном Firebug, в котором есть консоль, с возможностью исполнять произвольный javascript код (а также многими другими возможностями, которые нам в этой статье не понадобятся).
1. Типы данных.Основные типы данных в javascript — это number (целые, или с плавающей точкой), string, boolean, object, array и function. По своей сути, все это — объекты. Это значит, что у каждого из этих типов данных есть (или может быть) набор методов. Особенно удивительно лично для меня в свое время было такое отношение к функциям. Небольшой пример:
var bool = true // или var bool = new Boolean(true);
var num = 42 // или var num = new Number(42);
var str = "hello world" // или var str = new String("hello world");
var arr = [1, 2, 3]; // или var arr = new Array(1, 2, 3);
var obj = {foo: 'bar'}; // или var obj = new Object({foo: 'bar'});
var fnc = function() { alert('hello world'); } // или var fnc = new Function("alert('hello world');");
Как видно, у любого типа данных есть соответствующий ему объект.
2. Среда исполнения.Нужно понимать, что, независимо от того, чему вас там учат всякие "javascript за 5 дней", на самом деле понятия "глобальная область видимости" в том виде, в котором мы к нему привыкли, в javascript не существует. Объявляя переменную с ключевым словом var, мы всего лишь объявляем свойство глобального объекта, которым в браузерах является объект window. Всякий раз, когда мы обращаемся к переменной, которая не объявлена в текущей области видимости, интерпретатор ищет одноименное свойство глобального объекта, и, если находит, использует его. Поэтому, следующие две строчки кода равносильны:
alert('hello world');
window.alert('hello world');
3. Объекты.По своей сути объект — это набор свойств, объединенных по какому-либо признаку. Примером может служить объект Math, содержащий в себе набор математических констант и функций, вроде round (округление) и atan (рассчет арктангенса). Подробнее про стандартные объекты javascript
написано здесь (привожу английский вариант статьи, так как русский вариант неполный).
Особое внимание читателя хочу обратить на то, как можно изменять объекты во время выполнения, добавляя или удаляя их свойства. Во-первых, можно добавить или удалить свойство одного единственного объекта. В таком случае аналогичное свойство всех других объектов этого типа будет по прежнему доступно. Во-вторых, можно добавить или удалить свойство прототипа, таким образом изменив все объекты этого типа. Вот пример таких действий над типом String:
var str = new String("hello world");
typeof str.alert; // 'undefined'
str.alert = function() { window.alert(this); }
typeof str.alert; // 'function'
var s2 = new String('test');
typeof s2.alert; // 'undefined'
delete str.alert;
String.prototype.alert = function() { window.alert(this); }
typeof str.alert; // 'function'
typeof s2.alert; // 'function'
typeof 'test'.alert; // 'function'
Для подобных операций в mootools служит метод implement(), но о нем позже.
Допустим, нам нужно создать новый типовый объект с набором своих методов. Именно для этого и используется конструкция {}. Давайте посмотрим:
var cart = {
items: [],
length: function() { return this.items.length; }
add: function(item) { this.items.push(item); return true; }
remove: function(item) { this.items.erase(item); } // метод Array.erase из фреймворка mootools
}
Код, который я привел выше, это типичный пример бесполезного задротского примера из книг а-ля "за 5 минут". Потому что на самом деле он никому не нужен, и смотреть на него не интересно. Зато полезно знать, как в js объявлять уникальный объект (т.е. единственный в своем роде). В моем случае, это корзина пользователя, в которую можно добавлять и удалять товары. Но что если нам нужно создать несколько однотипных объектов? Неужели нам прийдется постоянно прописывать все их методы? Ну конечно-же нет! Ведь на свете столько ленивых людей!
cart.Item = new Class({
name: null,
price: null,
initialize: function(name, price) {
this.name = name;
this.price = price;
}
});
// теперь мы можем невозбранно добавлять новые объекты в корзину
cart.add(new cart.Item('какая-то хрень', 5.00));
cart.add(new cart.Item('хрень от Лебедева', 100500.00));
Не углубляясь в детали js, я сразу же использовал в этом примере объект Class из библиотеки mootools. Он принимает аргументом при вызове типовый набор свойств для нового класса. А свойство "initialize" служит в новом классе конструктором. Подробнее об объекте Class
нарисовано фломастерами на заборе (на английском, потому что понаехали).
Углубляться в объекты сильнее я на данном этапе не стану.
4. Замыкания (Closures).Одна из сложных в освоении но легких в использовании фич javascript — замыкания. Допустим, нам нужно создать обработчик события нажатия мыши на какой-либо ссылке, в котором нужно поменять текст в каком-либо другом элементе. Зацениваем код:
var global = {
addOnClick: function(link, div) {
link.addEvent('click', function() {
div.set('text', 'Хватит кляцать все подряд, блин!');
});
}
}
И хотя в самой функции-обработчике переменной div нет, она есть в области видимости функции addOnClick, откуда успешно и вытаскивается при срабатывании события. Вот это все кто-то и назвал замыканиями. Я не знаю кто, потому что я профессиональный быдлокодер на PHP.
На сегодня все, ждите следующих частей. В следующей части я раскрою такие страшные тайны, как обработка событий, инициализация скриптов на веб-странице и немного углублюсь в тему классов и объектов. Вопросы в комментариях жду с нетерпением.