Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инфа1.doc
Скачиваний:
10
Добавлен:
17.04.2019
Размер:
350.21 Кб
Скачать

Фабрика объектов

Есть альтернативный способ наследования, который вообще не требует вызова new.

При этом объекты создаются с помощью "фабричных функций" (factory function). Например, в следующем примере это функция Animal, которая производит некие действия и возвращает объект.

01

function Animal(name) {

02

    var speed = 10

03

    return {

04

        name: name,

05

        run: function(distance) {

06

            return distance / speed

07

        }

08

    }

09

}

10

pet1 = Animal()

11

pet2 = Animal()

Через замыкания (о функциях и замыканиях) организуются "приватные" члены класса. В примере выше доступ к переменной speed возможен только из функции run .

Задача фабрики объектов - создать объект и инициализировать его.

Создание потомка

Для создания потомка фабрика объектов просто модифицирует объект, создаваемой функцией-родителем.

Рассмотрим пример с созданием Rabbit - потомка Animal:

01

function Rabbit(name) {

02

 

03

    // вызвать конструктор родителя,

04

    // получить родительский объект в me

05

    var me = Animal(name) 

06

     

07

    // добавить приватную переменную

08

    var jumps = 0  

09

 

10

    /* добавить новые методы к me */

11

    me.jump = function() { jumps++ }

12

    me.getJumps = function() { return jumps }

13

 

14

    // поставить правильное свойство конструктора

15

    // (делаем вид, что объект создали мы, а не Animal)

16

    me.constructor = arguments.callee

17

 

18

    return me

19

}

При создании потомка фабричная функция делает следующее:

  1. Создает объект родительского класса

  2. Присваивает ему публичные свойства и методы

  3. Меняет свойство constructor объекта на себя

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

Фактически, функция берет другой объект и добавляет ему свои методы. Из-за этого такую реализацию наследования иногда называют паразитическим наследованием.

Почему этот способ мой любимый?

Во-первых, потому, что именно такой стиль ООП, как мне кажется, наиболее соответствует по духу яваскрипт.

Он прост и понятен.

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

13) DOM обходы в JS. Перечислить способы.

14) Атрибуты DOM объектов и свойства. Чем отличаются.

И те и другие имеют имя и значение.

Узлы DOM являются объектами с точки зрения javascript. А у объектов есть свойства. Поэтому

любому узлу можно назначить свойство, используя обычный синтаксис. Значением свойства может быть

любой объект. Это же javascript.

DOM-элемент может иметь любое количество атрибутов.

Атрибуты можно добавлять, удалять и изменять. Для этого есть специальные методы.

Значением атрибута может быть только строка. Это же HTML.

Основным инструментом работы и динамических изменений на странице является DOM (Document Object Model) - объектная модель, используемая для XML/HTML-документов.

Согласно DOM-модели, документ является иерархией. Каждый HTML-тег образует отдельный элемент-узел, каждый фрагмент текста - текстовый элемент, и т.п.

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