Wzorzec fabryki obiektów w JS

Javascript posiada wiele sposobów na stworzenie obiektów. W tym wpisie pokażę jeden z nich – mój ulubiony.

JS bardzo łatwo jest stworzyć obiekt:

var obj = {};

Taki zapis (literał obiektowy) jest równoważny z:

var obj = new Object;

Jednak z moich testów wynika, że pierwszy zapis działa odrobinę szybciej w większości przeglądarek. Dodatkowo pozwala na uniknięcie problemów związanym z nadpisaniem zmiennej `Object’ – szerzej opisane w artykule o JSON.

Taki obiekt jest pusty. Co nam po pustym obiekcie? Co prawda możemy zrobić tak:

var obj = {};
obj.a = 1;
obj.b = 'Ala ma kota';
obj.func = function() { alert('Func'); }

lub:

var obj = {
    'a'    : 1,
    'b'    : 'Ala ma kota',
    'func' : function() { alert('Func'); }
};

Jest to jednak zapis dosyć niewygodny i długi. Czy nie da się tego zrobić łatwiej? Owszem – da. Stwórzmy sobie funkcję:

function createObject(a, b)
{
    var obj = {};
    obj.a = a;
    obj.b = b;
    obj.func = function()
    {
        alert('Func');
    }

    return obj;
}

// do zmiennej MyObj zostaje przypisany obiekt
var MyObj = createObject(1, 'Ala ma kota'); 

Teraz pod nazwą `MyObj’ znajduje się obiekt posiadający 2 pola: `a’, `b’, `func’. Pola te mają ustawioną wartość przy wypełnianiu obiektu w funkcji. W obiekcie znajduje się także metoda o nazwie `func’. Wszystkie pola obiektu są publiczne, zatem można się do nich odwoływać w taki sposób:

// do zmiennej przypisujemy nowa instancje obiektu
var MyObj = createObject(1, 'Ala ma kota');
alert(MyObj.a);
alert(MyObj.b);
MyObj.a = 10;
MyObj.b = "Ola ma psa";
alert(MyObj.a);
alert(MyObj.b);

Inną spotykaną nazwą jest “wzorzec modułu”.

Warto przeczytać

4 komentarze

  1. Sądzę, że rzeczywiście o jeden za dużo “wpisie pokażę[przecinek zbędny] jeden”.
    Jeśli jeszcze jakiś uważasz za zbędny, to z chęcią dowiem się gdzie 🙂

  2. w innym artykule, “JSON i literały obiektowe” – “w literale obiektowym, nie trzeba używać apostrofów/cudzysłowów.”
    a tak bardziej na temat – po co używać tych wzorców modułu zamiast zwykłego konstruktorro?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *