Сны в стиле JavaScript

Как то задумал изложить некотрые вещи которые мне понравились в JavaScript, однако до сих пор даже эта статья оказалась незавершенной, отчасти что несмотря на простоту я еще не нашел тот один единственный путь создания скрипров на JavaScript. Возможно такой и никогда не будет найден.

Сон первый: классы и объекты

Сон о том как в JavaScript можно создавать объекты и классы и как с ними работать.

Итак приступим...

JavaScript это мощный язык программирования, сочетающий в себе простоту и наличие последних новомодных средств, таких как объектно-ориентированное программирование, обработка исключительных ситуаций и т.п. Правда, несмотря на всю свою мощь в этом языке не предусмотрено средств для работы с вводом-выводом, средств создания пользовательского интерфейса, словом, всего того, что необходимо для создания законченных приложений. Но это не являэтся его недостатком. JavaScript был создан только для одного – для создания эффективных интерпретируемых сценариев. С этой своей задачей он справляется очень хорошо.

Для создания пользовательского интерфейска вполне можно использовать другие приложения, например Internet Explorer или любой другой браузер со встроенной поддержкой DHTML и XML DOM. Причем это не единственный способ создания полнофункциональных приложений, но, на мой взгляд, он является наиболее простым.

Работая в области интернет технологий постоянно сталкиваешся с различными скриптами, написанными на этом замечательном языке, написанными так, словно бы автор специально запутывал логику работы программы, делая невозможным что либо в ней понять или использовать для себя. Отчасти, возможно так оно и есть. Ведь не каждому хочется, чтобы его труд, которому он посвятил много дней и ночей был кем то использован... Мы пойдем другим путем, попытаемся сделать наш код простым и понятным, что бы не нужно было работать "много дней и ночей". Давайте работать быстро. Возьмем за установку – мы пишем просто и понятно, чтобы программу, кторую мы написали мог понять потом только один человек – мы сами. Возможно этот же код можло будет потом использовать повторно в других приложениях, а это уже будет огромная экономия времени и сил.

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

<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>
//здесь будет наш скрипт... //--> </script> </head>
<body> </body> </html>

JavaScript это объектный язык, не объектно-ориентированный, в нем нет настоящих объектно-ориентированныых средств, таких как наследование, ограничение бласти видимости и т.п., хотя наследование вполне можно в этом языке эмулировать добиваясь того же самого результата при помощи прототипов, но это уже совсем другая история...

Все вокруг – объекты

Три способа создания функций

первый способ:

function F1(){ alert("Функция, созданная первым способом!"); }

второй способ

F1 = function(){ alert("Функция, созданная вторым способом!"); }

третий способ

F1 = new Function("alert("Функция, созданная вторым способом!");")

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

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

Объкты создаются двумя способами:

при помощи конструктора

/**
* Это конструктор, в сущности, любая функция может * являться
конструктором, если перед ее вызовом поставить new */ function Funk1(){
this.name = "Это будет имя нашего объекта" } //теперь собственно создаем
екземпляр объекта obj = new Func1(); при помощи фигурных скобок: obj = {
name:"Это будет имя нашего объекта" }

оба способа дают один и тот же результат, однако в первом способе при использовании одного конструктора можно создать несколько разных объектов в то время как при помощи второго способа объект создается сразу.

Создание методов

в принципе методы можно создавать по разному, ничто не мешает нам сначала создать функцию, а потом присвоить ее в конструкторе объекта (для любителей Си++)

function Funk1(){ this.prototype.method = Funk1_method; } function Funk1_method(){ alert(); }

мне нравится такой способ (для любителей Java):

function Funk1(){ this.method = function(){ alert(); } }

еще я часто встречаю такой способ (наверно для мазохистов, т.к. Все и так работает, если вы знаете, зачем нужно присваивать функцию прототипу, объясните мне):

function Funk1(){ } Funk1.prototype.method = function(){ alert(); }

методы можно присваивать на этапе работы программы, когда объект уже создан:

function Funk1(){ } var obj = new Funk1(); obj.method = function(){ alert(); }

правда в этом случае метод будет определен только для этого объекта.

Оператор delete

Этот оператор используется не совсем так как скажем с Java, C++ или дурегих аналогичных языках. Оперетор delete используется для удаления свойств объекта, в том числе свойств функций.

Оператор instanceof

 

Позволяет узнать является ли данный объект объектом данного типа.

Волшебный typeof.

Первый наш код будет таким:

function wind(){ } alert(typeof(wind));

В результате выполнения нашего кода – получаем сообщение:

значит wind – это такая же переменная как и все остальные, давайте подробнее изучим эту переменную. Из документации мы узнаем, что в JavaScript существует встроенный объект называемый Function – не с ним ли мы имеем дело? Объект Function имеет несколько свойств первое что находим свойство arguments

alert(typeof(v.arguments));

Получаем:

ага, значит это все таки объект Function.

var wind = new cWind(); alert(typeof(wind));

Ага, значит cWind – это объект типа функция а переменная wind, которой присвоили результат выполнения оператора new – это уже объект! Причем

alert(wind);

Дает нам: