некоторые вкусности JavaScript

Начиная пользоваться Javascript, каждый разработчик учиться делать alert() и setTimeout(), а что делает с Javascript “продвинутый” разработчик? Постараемся рассмотреть аспекты, которые позволяют делать код гибче и удобочитаемее…

Немножко от ООП .

Javascript очень интересный язык. У него нет строгой типизации и все элементы представляют из себя объекты. Больше того — каждая объявленная переменная без var, является свойством наивысшего в иерархии объекта JS — объекта window.
[js]
variable = 10;
alert(window.valiable); //alerts “10″
[/js]
Объекты объектами, но сама объектная сущность языка существенно пострадала из-за отсутствия уровней доступа (public, protected, private) а так же наследования и иже с ним. Но мы можем не только эмулировать необходимые уровни доступа, но и даже создавать паттерны разработки, ничем не уступающие языковым конструкциям в полноценных языках! Так создадим наиболее востребованный в условиях Javascript паттерн “Singleton” (одиночка). Применение данного паттерна позволяет использовать однажды созданный объект со всеми инициализированными свойствами, не переопределяя раз за разом конфигурационные директивы (к примеру). Как будет выглядеть singleton в JS?
[js]
var singleton = function () {
var property; //так выглядит private свойство
function method() { } //…а так — private метод
return {
‘value’ : ‘public_val’, //а вот это уже public свойство
‘init’ : function () { //…и public метод
alert(this.value); //покажем доступ к public свойству
alert(property); //вызовем значение private переменной
method(); //обращение к приватному методу
}
}
}(); //использовав скобки, мы выполнили эту функцию и вернули ее значение в объект singleton’а

singleton.init(); //так обращаемся к public методам “класса”
alert(singleton.value); //выводит значение public переменной

/* а эти два вызова завершатся ошибкой */
singleton.method();
alert(singleton.property);
[/js]

Увеличиваем читабельность кода

Многие библиотеки на Javascript созданы в том числе и для уменьшения кода, который приходится писать и дублировать в своих приложениях для браузера. Так, например, метод $() из библиотеки prototype или mootools очень упростил жизнь не одному разработчику, а код сделал стройнее и понятнее. Но даже фреймворки такого размаха и типа могут привести к тому, что код будет выглядеть подобным образом (абстрактный пример):
[js]
someobj.somemeth().prop.method().array[1].value;
someobj.somemeth().prop.method2().value4;
someobj.somemeth().prop.meth().array7[4];
[/js]
Очевидно бессмысленное повторение однообразного кода для доступа к свойствам и методам “на глубине”. порой такие конструкции могут доходить до неимоверных размеров и читабельность кода, в итоге, начинает стремиться к нулю… Но программисты интерпретатора Javascript подумали о разработчиках и ввели оператор with(), который в данном случае спасет наш код. Пример покажет лучше:
[js]
with (someobj.somemeth().prop) {
method().array[1].value;
method2().value4;
meth().array7[4];
}
[/js]
Чего мы добились? Код стал значительно читабельнее, а интерпретатору нет необходимости высчитывать путь обращения каждый раз — он начинает использовать внутренний кеш.

На сейчас, пожалуй, достаточно, а в следующий раз постараюсь затронуть некоторые другие аспекты “углубленной” разработки на языке Jasavscript :)

Tags: , , , ,

Также рекомендую к прочтению:

7 Responses to “некоторые вкусности JavaScript”

  1. BITCreator Says:

    А вот PLAIN TEXT мне понравился! :)

  2. Алексей Токарь Says:

    кому шо, а ему ПлейнТекст понравился :)))

  3. drumrock Says:

    Насчёт with. Очень многие разработчики, включая создателей языка, не рекомендуют его использовать. :-)

  4. Алексей Токарь Says:

    ссылку на источник сведений, плз :)

  5. drumrock Says:

    Here you go!

    http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/

    По рекомендации ( http://javascript.crockford.com/ ) Дугласа Крокфорда

  6. Алексей Токарь Says:

    собсно не рекоммендует только по причине, что ему не понятно какая из переменных будет изменена - та что свойство with() объекта или глобальная переменная вне with().
    Достаточно руководствоваться правилом что всегда сначала проверяются более глубокие свойства и потом идет движение по дереву объекта вверх. соответственно, если свойство найдено не будет - будет попытка изменить глобальную переменную, а если не будет и ее - создать новую (кстати являющуюся свойством window)

    там же в блоге указан адекватный способ - кешировать результат доступа к свойству в новую переменную. Мне такой подход не импонирует - не люблю ненужные переменные ;)

  7. BeGeMoT Says:

    Ты дядю, Крокфорда слушай, он плохого не посоветует.

Leave a Reply

Введите следующие символы: