Blog webdeveloperski Patryk yarpo Jar

Wzorzec fabryki obiektów w JS

Autor wiadomości Styczeń 11, 2011

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ć

Komentarze (4) Trackbacks (0)
  1. stawiasz za dużo przecinków

  2. 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 🙂

  3. 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?

  4. function Example1()
    {
    this.a = ‘hello world’;
    }

    var obj1 = Example1(); // powinno być: new Example1();
    alert(obj1.a); // błąd

    function example2()
    {
    return { a : ‘hello world’ };
    };

    var obj2 = example2(); // new niepotrzebny
    alert(obj2.a)

    Więcej o obiektach przeczytasz w pierwszym rozdziale:
    http://www.yarpo.pl/2011/06/03/javascript-na-powaznie/


Leave a comment

 

Brak trackbacków.