Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Web-программирование - это просто!


Новое на сайте Программирование - это просто! (www.easyprog.ru):

В платном разделе

В бесплатном разделе

В разделе Программные продукты

Добрый день, уважаемые подписчики!

Тема сегодняшнего выпуска: «Java Script(JS): Начало создания библиотеки визуальных объектов».

 

Все, сегодня мы начинаем стоить библиотеку.  Исходники заготовки библиотеки с тестовым примером (файлы XBrBase.js, XBrGlobalProc.js, XBrGlobalVars.js, testCXBrBaseInterfaceClass.html) вы можете скачать здесь. А в рамках данной рассылки мы рассмотрим идеи, на которых будет строиться библиотека.

 

И так, начнем с базового класса, вот его конструктор:

// ********** Объявления класса CXBrBaseInterfaceClass *******************

function CXBrBaseInterfaceClass() {

      this._id=_global_id;

      _global_id++;

      this._owner=null;

      this._name="";

      this._is_child=CXBrBaseInterfaceClass_is_child;

      this._is_child_or_self=CXBrBaseInterfaceClass_is_child_or_self;

      this._is_parent=CXBrBaseInterfaceClass_is_parent;

      this._is_parent_or_self=CXBrBaseInterfaceClass_is_parent_or_self;

      this._get_class_name=CXBrBaseInterfaceClass_get_class_name;

      this._event_handler=CXBrBaseInterfaceClass_event_handler;

      this._create_message=CXBrBaseInterfaceClass_create_message;

      this._set_name=CXBrBaseInterfaceClass_set_name;

      this._hierarchy_classes=new Array;

      this._hierarchy_classes.push(this._get_class_name());

      this._error=CXBrBaseInterfaceClass_error;

      this._dests=new Array;

      this._get_name=CXBrBaseInterfaceClass_get_name;

      _global_container['_'+this._id]=this;

}

 

На первый взгляд что то страшное и ужасное. Но давайте разберем построчно. Начнем с команды

this._id=_global_id;

 

И так, мы инициируем свойство _id - уникальный идентификационный код объекта. Уникальность обеспечивается за счет приращения переменной _global_id. Она у нас объявлена в файле "XBrGlobalVars.js".

Затем мы индицируем поля _name и _owner пустыми значениями:

      this._owner=null;

      this._name="";

 

У данного класса очень много методов, в дальнейшем мы разберем и их:

      this._is_child=CXBrBaseInterfaceClass_is_child;

      this._is_child_or_self=CXBrBaseInterfaceClass_is_child_or_self;

      this._is_parent=CXBrBaseInterfaceClass_is_parent;

      this._is_parent_or_self=CXBrBaseInterfaceClass_is_parent_or_self;

      this._get_class_name=CXBrBaseInterfaceClass_get_class_name;

      this._event_handler=CXBrBaseInterfaceClass_event_handler;

      this._create_message=CXBrBaseInterfaceClass_create_message;

      this._set_name=CXBrBaseInterfaceClass_set_name;

...

      this._error=CXBrBaseInterfaceClass_error;

...

     this._get_name=CXBrBaseInterfaceClass_get_name;

 

Так же мы создаем вспомогательные поля:

      this._hierarchy_classes=new Array;

...

     this._dests=new Array;

...

 

В массив названий классов добавляем новый класс (который мы создаем):

...

this._hierarchy_classes.push(this._get_class_name());

...

 

 

Ну, и на последок, помещаем ссылку на созданный объект в глобальный контейнер:

      _global_container['_'+this._id]=this;

 

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

 

Метод Что делает Входные параметры Возвращаемое значение
_is_child Определяет, является ли данный объект или имя класса дочерним от заданного Объект, CXBrBaseInterfaceClass или его потомок, либо строка с именем класса boolean
_is_child_or_self Определяет, является ли данный объект или имя класса дочерним от заданного либо совпадает. Объект, CXBrBaseInterfaceClass или его потомок, либо string с именем класса boolean
_is_parent Определяет, является ли данный объект или имя класса родительским к заданному. string boolean
_is_parent_or_self Определяет, является ли данный объект или имя класса родительским к заданному либо совпадает. string boolean

 

Для иллюстрации работы данных методов испытаем тестовый пример:

 

<html>

 

<head>

  <title></title>

      <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="XBrBase.js">

      </SCRIPT>

      <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="XBrGlobalVars.js">

      </SCRIPT>

      <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="XBrGlobalProc.js">

      </SCRIPT>

</head>

 

<body>

      <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

 

            function CXBrBaseInterfaceClass1() {

                  CXBrBaseInterfaceClass.call(this)

                  this._get_class_name=CXBrBaseInterfaceClass1_get_class_name

                  this._hierarchy_classes.push(this._get_class_name())

            }

 

            function CXBrBaseInterfaceClassSec() {

                  CXBrBaseInterfaceClass.call(this)

                  this._get_class_name=CXBrBaseInterfaceClassSec_get_class_name

                  this._hierarchy_classes.push(this._get_class_name())

            }

 

            function CXBrBaseInterfaceClass1_get_class_name() { return "CXBrBaseInterfaceClass1" }

            function CXBrBaseInterfaceClassSec_get_class_name() { return "CXBrBaseInterfaceClassSec" }

 

            var ob=new CXBrBaseInterfaceClass()

            var ob1=new CXBrBaseInterfaceClass()

 

            var ob_child=new CXBrBaseInterfaceClass1()

            var ob_other=new CXBrBaseInterfaceClassSec()

 

            document.write("<font size=5><b>Тестирование класса CXBrBaseInterfaceClass<br></b></font>")

            document.write("<b>Тестирование конструктора<br></b>")

            document.write("ob._id="+ob._id+"<br>")

            document.write("ob1._id="+ob1._id+"<br>")

            document.write("<b>Тестирование  _get_class_name()<br></b>")

            document.write("ob._get_name()="+ob._get_class_name()+"<br>")

            document.write("ob1._get_name()="+ob1._get_class_name()+"<br>")

            document.write("А вот теперь попробуем переопределить класс и у него посмотреть _get_class_name()<br>")

            document.write("ob_child._get_name()="+ob_child._get_class_name()+"<br>")

            document.write("<b>Тестируем массив _hierarchy_classes<br></b>")

            document.write("ob._hierarchy_classes="+ob._hierarchy_classes+"<br>")

            document.write("ob_child._hierarchy_classes="+ob_child._hierarchy_classes+"<br>")

            document.write("<b>Тестирование _is_child<br></b>")

            document.write("ob._is_child('CXBrBaseInterfaceClass')="+ob._is_child("CXBrBaseInterfaceClass")+"<br>")

            document.write("ob._is_child(ob1)="+ob._is_child(ob1)+"<br>")

            document.write("ob_child._is_child(ob)="+ob_child._is_child(ob)+"<br>")

            document.write("ob_child._is_child('CXBrBaseInterfaceClass')="+ob_child._is_child('CXBrBaseInterfaceClass')+"<br>")

            document.write("<b>Тестирование _is_child_or_self<br></b>")

            document.write("ob._is_child_or_self('CXBrBaseInterfaceClass')="+ob._is_child_or_self("CXBrBaseInterfaceClass")+"<br>")

            document.write("ob._is_child_or_self(ob1)="+ob._is_child_or_self(ob1)+"<br>")

            document.write("ob_child._is_child_or_self(ob)="+ob_child._is_child_or_self(ob)+"<br>")

            document.write("ob_child._is_child_or_self('CXBrBaseInterfaceClass')="+ob_child._is_child_or_self('CXBrBaseInterfaceClass')+"<br>")

            document.write("ob_child._is_child_or_self('CXBrBaseInterfaceClass2')="+ob_child._is_child_or_self('CXBrBaseInterfaceClass2')+"<br>")

 

            document.write("<b>Тестирование _is_parent<br></b>")

            document.write("ob._is_parent(ob1)="+ob._is_parent(ob1)+"<br>")

            document.write("ob_child._is_parent(ob)="+ob_child._is_parent(ob)+"<br>")

            document.write("ob._is_parent(ob_child)="+ob._is_parent(ob_child)+"<br>")

 

            document.write("<b>Тестирование _is_parent_or_self<br></b>")

            document.write("ob._is_parent_or_self(ob1)="+ob._is_parent_or_self(ob1)+"<br>")

            document.write("ob_child._is_parent_or_self(ob)="+ob_child._is_parent_or_self(ob)+"<br>")

            document.write("ob._is_parent_or_self(ob_child)="+ob._is_parent_or_self(ob_child)+"<br>")

 

            document.write("<b>Дополнительное тестирование<br></b>")

            document.write("ob._is_child('CXBrBaseInterfaceClassSec')="+ob._is_child("CXBrBaseInterfaceClassSec")+"<br>")

            document.write("ob._is_child(ob_other)="+ob._is_child(ob_other)+"<br>")

            document.write("ob_other._is_child(ob)="+ob_other._is_child(ob)+"<br>")

            document.write("ob_other._is_child('CXBrBaseInterfaceClass')="+ob_other._is_child('CXBrBaseInterfaceClass')+"<br>")

 

      </SCRIPT>

</body>

 

</html>

 

А вот протокол работы программы:

Тестирование класса CXBrBaseInterfaceClass
Тестирование конструктора
ob._id=1
ob1._id=2
Тестирование _get_class_name()
ob._get_name()=CXBrBaseInterfaceClass
ob1._get_name()=CXBrBaseInterfaceClass
А вот теперь попробуем переопределить класс и у него посмотреть _get_class_name()
ob_child._get_name()=CXBrBaseInterfaceClass1
Тестируем массив _hierarchy_classes
ob._hierarchy_classes=CXBrBaseInterfaceClass
ob_child._hierarchy_classes=CXBrBaseInterfaceClass,CXBrBaseInterfaceClass1
Тестирование _is_child
ob._is_child('CXBrBaseInterfaceClass')=false
ob._is_child(ob1)=false
ob_child._is_child(ob)=true
ob_child._is_child('CXBrBaseInterfaceClass')=true
Тестирование _is_child_or_self
ob._is_child_or_self('CXBrBaseInterfaceClass')=true
ob._is_child_or_self(ob1)=true
ob_child._is_child_or_self(ob)=true
ob_child._is_child_or_self('CXBrBaseInterfaceClass')=true
ob_child._is_child_or_self('CXBrBaseInterfaceClass2')=false
Тестирование _is_parent
ob._is_parent(ob1)=false
ob_child._is_parent(ob)=false
ob._is_parent(ob_child)=true
Тестирование _is_parent_or_self
ob._is_parent_or_self(ob1)=true
ob_child._is_parent_or_self(ob)=false
ob._is_parent_or_self(ob_child)=true
Дополнительное тестирование
ob._is_child('CXBrBaseInterfaceClassSec')=false
ob._is_child(ob_other)=false
ob_other._is_child(ob)=true
ob_other._is_child('CXBrBaseInterfaceClass')=true

 

На этом я закончу выпуск, продолжение следует.

 

С уважением, Шуравин Александр, e-mail: megabax@rambler.ru, автор оставляет за собой право публиковать в рассылках ваши письма, если в письме прямо неоговорено нежелание его публиковать.

 


В избранное