Правила использования JavaScript

Кис Геннадий.

(с) АО Банкомсвязь. Программные Системы.  2000 г.

Дата  последней модификации:  Апрель 27, 2001

Рекомендации по использованию JavaScript (JScript 2) на серверной части в технологии Active Server Page   предназначены главным образом в помощь  начинающим пользователям ASP, которым приходится тратить многие часы за чтением MSDN. Решения, изложенные в данном тексте, основаны на опыте программирования автора, поэтому рассматривайте их только как советы.  Огромная просьба,  замечания направляйте по адресу gena@ps.bkc.com.ua

Для более детальной информации можно использовать http://www.webreference.com/js/

Оглавление

Общие замечания по JavaScript

1. Использование переменных
2. Массивы
3. Функции
4. Классы

4.1. Наследование
4.2. Переопределение функций

Замечания по ASP

1. Вызов JavaScript скриптов в IIS 4.0 и ниже
2. Вызов JavaScript скриптов в IIS 5.0 и выше
3. Использование Session и Application
4. Оптимизация
5. Переносимость

Технология построения пользовательского интерфейса с использованием CGI протокола  (редактируется)

Общие замечания по JavaScript

1. Использование переменных

Пример:

Неправильно:

function reverse(x) {
  a = "";
  i = x.length;
  while (i > 0)
    a += x.charAt(--i);
  return a;
}
var a = “birth”;
var b = reverse (a);
теперь значение переменной a равно "htrib"

Правильно:

function reverse(x) {
  var a = "";
  var i = x.length;
  while (i > 0)
    a += x.charAt(--i);
  return a;
}
var a = "birth";
var b = reverse (a);

Неправильно:

function Complex(re,im) {
  this.re =  0;
  this.im =  0;
}

var c = new Complex;
var dim = [];
for(var i=0;i<10;i++)
dim[i] = c;

c.re = 1;
c.im = -1;

В результате весь массив dim будет ссылаться
на один и тот же объект, содержащий
последнее установленное значение (1,-1).

Правильно:

var dim = [];
for ( var i=0;i<10;i++)
  dim[i] = new Complex;

2. Массивы

3.Функции

4. Классы

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

function Class () {
   // Attribute definitions
   this.attribute1 = value1;
   this.attribute2 = value2;
   ...
   // Private attribute definition
   var private1 = private_value1
   ...
   // Method declaration
   this.method1 = _method1;
   this.method2 = _method2;
   ...
   // Implementation
   function _method1() {…}
   function _method2() {…}
   ...
   // Initialization
   ...
}

Тело функции-конструктора условно разбивается на следующие секции:

4.1. Наследование

Наследование в JavaScript можно осуществить с помощью прототипирования объекта.

Для этого объявите родительский класс, объявите дочерний класс, создайте экземпляр родительского класса и укажите его в качестве прототипа для дочернего класса. Теперь при создании объекта дочернего класса он будет приобретать все свойства, включая фактические значения атрибутов как у прототипа.

Пример:

function Person() {
  this.name = “default”;
}

function Worker() {
  this.speciality = “carpenter”;
}

Worker.prototype = new Person;
var w = new Worker;

Обработка доступа к функциям-членам и атрибутам на JavaScript осуществляется следующим образом: сначала идет поиск в самом объекте, если нет, то поиск в прототипе объекта, если прототип определен.

4.2. Переопределение функций

Переопределить метод объекта можно в любой момент выполнения. Если вы хотите переопределить метод прототипа, то лучше всего сделать это в конструкторе.

Пример:

function Parent() {
  this.getInfo = function () { return " parent "; }
}

function Child1() {
}

function Child2() {
  this.getInfo = function () { return " child "; }
}

var p = new Parent;
Child1.prototype = p;
Child2.prototype = p;
var list = [ new Child1, new Child2 ];

for (i=0; i < list.length; i++)
 Response.Write ( list[i].getInfo() ) ;

Результат работы:

parent child

Чтобы вызвать перекрытый метод прототипа используйте вызов через прототип. Пример:

function Child3() {
  this.getInfo = function () { return Child3.prototype.getInfo() + " child "; }
}

Если функция прототипа должна иметь доступ к свойствам объекта (т.е. имеет обращения к this), нужно поступить как в нижепреведенном примере:

function Child3() {
  this.parent_getInfo = Child3.prototype.getInfo;
  this.getInfo = function () { return this.parent_getInfo() + " child "; }
}

Иначе, по this функция прототипа будет обращаться к самому прототипу, а не к объекту.

Замечания по ASP

1. Вызов скриптов в версии IIS 4.0

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

Неправильно:

<script runat=server>
 function ClassA() {…}
 function ClassB() {…}
 ClassB.prototype=new ClassA;
</script>

Правильно:

<%
 function ClassA() {…}
 function ClassB() {…}
 ClassB.prototype=new ClassA;
%>

Примечание: Язык по умолчанию
должен быть JavaScript

2.  Вызов скриптов в версии IIS 5.0

Эта версии интернет-сервера позволяет непосредственно подключать JavaScript файл с помощью тега

<script src="script.js" language=javascript runat=server>

при этом отпадают вышеперечисленные проблемы и необходимость использования ASP-тегов в самих включаемых файлах

3. Использование Session и Application

Для хранения состояния приложения между обработками запросов клиентов можно пользоваться специальными коллекциями Session и Application.

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

JScript Run-time Errors 5011 "Can't execute code from a freed script"

Если все-таки нужно создавать свои объекты со временем жизни больше скрипта, сохраняйте только его состояние (в сессии, на странице, в куки или базе данных), а потом конструируйте объект с нужным состоянием.

Второй подход, это использование технологии MSC (microsoft scripting components), которая позволяет легко создавать COM-объекты из обычных ASP-скриптов.

Нельзя использовать в качестве прототипа объект, сохраненный в коллекции Session или Application, поскольку методы будут утеряны.

3. Оптимизация

Оптимизация должна быть тщательно продумана. В ASP-скриптах, как и в других языках, важно определить какие части приложения потребляют больше времени и ресурсов.

Несколько советов:

4. Переносимость

JavaScript может испольоваться не только в ASP. Часто хотелось бы достичь переносимости кода на другие интерпретаторы, например, WSH (microsoft windows scripting host, позволяющий писать достаточно мощные консольные и даже оконные приложения) с минимальными затратами на переделку кода, а   еще лучше раздлять  использование общего кода. Несколько практических рекомендаций по этому вопросу.

Технология построения пользовательского интерфейса с использованием CGI протокола (ASP-технология в частности).

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

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

Таким образом, запрос от клиента должен содержать не только имя объекта, к которому производится доступ, и требуемое от него действие (если объект позволяет несколько операций), но и текущее состояние этого объекта.

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

Хостинг от uCoz