среда, 2 ноября 2011 г.

JavaScript ООП. Создание классов

Я начинаю новый цикл статей, которые раскроют тему использования ООП в javascript, а также приведу примеры. Будем использовать javascript вместе с библиотекой jQuery.

Поговорим о создании классов. 

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

Хорошее представление об ООП в языке дает ресурс: http://javascript.ru/tutorial/object, где обговариваются основные приемы работы. Я же хочу поделиться сухим остатком от прочтения километров текстов документации и статей.

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

var TestClass = (function(){
  // Private:
  var version = "1.0",
      options,
      defaultOptions = {
        test: 1,
        temp: 0
      };
  var privateFunction = function(){
    return {data: 1};
  }
  // Constructor:
  var Init = function(params){
    options = $.extend(defaultOptions, params || {});
  };

  // Public:
  Init.prototype = {
    name: "Test Class",
    getVersion: function(){
      return version;
    },
    getOptions: function(){
      return options;
    }
  };
  return Init;
}());

testObj = new TestClass( { temp: "Tmp"} );

console.log('Version:', testObj.getVersion());
console.log('Options:', testObj.getOptions());
console.log('Name:', testObj.name);
console.log('v:', testObj.version);

В консоли будет:

Version: 1.0 - доступ к публичному методу, который вернул закрытое свойство
Options: Object { test=1, temp="Tmp"} - доступ к публичному методу, опции, как мы видим смержились со  входящим массивом
Name: Test Class - Доступ к публичному свойству 
v: undefined - из экземпляра, доступа к приватным полям нет (аналогично и с методами)


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

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

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

P. S. О наследовании поговорим в следующей статье.

0 коммент.:

Отправить комментарий