Wzorzec łańcuchowy oparty o fabrykę obiektów Drukuj
Ocena użytkowników: / 0
SłabyŚwietny 
Wpisany przez Patryk yarpo Jar   
niedziela, 05 września 2010 00:42

Javascript posiada wiele sposobów na tworzenie obiektów. Jednym z nich jest zworzec fabryki obiektów (czasem zwany wzorcem modułu). Chciałbym pokazać, jak można wykorzystując ten wzorzec stworzyć IMO wygodniejsze obiekty.

 

Kod prostego obiektu

        var yPerson = function()
        {
            var sName,
                nAge;

            function fName( name )
            {
                sName = name || sName;
                return sName;
            }

            function fAge( age )
            {
                nAge = age || nAge;
                return nAge;
            }

            return {
                name : fName,
                age  : fAge
            };
        };


	

 

Jak skorzystać z takiego kodu? Całkiem przyjemnie:

	var oPerson = yPerson();
	oPerson.name('Jan Kowalski');
	oPerson.age(26);
	alert(oPerson.name() + ' ' +  oPerson.age())


	

 

Do czego dążymy?

Chcemy uzyskać ostatecznie obiekt, którego będziemy mogli używać w ten sposób:

	var oPerson = yPerson();
	oPerson.name('Jan Kowalski').age(26);
	alert(oPerson.name() + ' ' +  oPerson.age())


	

Co prawda,  przy tak prostym obiekcie zyskaliśmy tylko jedną linię. Jednak w przypadku bardziej złożonych struktur można naprawdę oszczędzić sobie spoor kodu. Wzorzec łańcuchowy jest powszechnie wykorzystywany w jQuery.

 

Jak to osiągnąć?

Aby osiągnąć taki efekt należy po prostu w każdej metodzie zwracać referencję na obiekt, którego używamy.

var yPerson = function()
{
    var sName,
    nAge;

    // tworz obiekt
    var that = {
          name : fName,
          age  : fAge
    };

    function fIsSetter( data )
    {
        return ('undefined' !== typeof data);
    }

    function fName( name )
    {
        if (fIsSetter(name))
        {
            sName =  name || sName;
            return that; // zwroc referencje na samego siebie
        }
        return sName; // metoda w roli gettera
    }

    function fAge( age )
    {
        if (fIsSetter(age))
        {
            nAge =  age || nAge;
            return that; // zwroc referencje na samego siebie
        }
        return nAge;
    }

    return that; // zwroc obiekt
};