Javascript to język w pełni obiektowy. Obiektem jest wszystko: funkcja – obiekt, obiekt – obiekt, zmienna – obiekt… Eh, no i ta pełność ma swoje “widzimisie” i problemy.

Wartości logiczne

W klasycznej logice są dwie: true i false (prawda i fałsz). W JS istnieje jednak konstruktor dla wartości logicznych:

var oBool = new Boolean(false);

Continue reading

Czasem przydatna staje się wiedza o tym, które ze znanych rozwiązań jest szybsze. Oczywiście można polegać na teoretycznej wiedzy, podpierać się nawet złożonością algorytmów itd. itd. Często jednak starczy kilka prostych testów. Oto obiekt pozwalający w banalny sposób sprawdzić jak szybko wykonał się skrypt. Nazwałem go yProfiler.

Kod

// obiekt yProfiler - zliczanie czasu wykonania skryptu
// autor: Patryk yarpo Jar
var yProfiler = function()
{
var nTimeStart = 0,
     nTimeStop  = 0,
     nLastDuration = -1,
     oDate = null;

    function fStart()
    {
        oDate = new Date();
        nTimeStart = oDate.getTime();
        return nTimeStart;
    }
    function fStop()
    {
        oDate = new Date();
        nTimeStop = oDate.getTime();
        nLastDuration = nTimeStop-nTimeStart;
        return nLastDuration;
    }
    function fTime()
    {
        // nie wystartowano jeszcze :/
        if (!nTimeStart)
        {
            return false;
        }
        // nie skonczono jeszcze
        if (!nTimeStop)
        {
            fStop();
        }
        if (nLastDuration < 0 || isNaN(nLastDuration))
        {
            nLastDuration = nTimeStop - nTimeStart;
        }
        return nLastDuration;
    }
    function fGetStart()
    {
        return (nTimeStart) ? nTimeStart : false;
    }
    function fGetStop()
    {
        return (nTimeStop) ? nTimeStop : false;
    }
    function fLoop(func, n)
    {
        fStart();
        for(i = 0; i < n; i++)
        {
            func();
        }
        fStop();
        return nLastDuration;
    }

    // konstruktor:
    fStart(); // domyslnie startuje
    return {
        start   : fStart,
        stop    : fStop,
        time    : fTime,
        getStart: fGetStart,
        getStop : fGetStop,
        loop    : fLoop
    };
};

W tym obiekcie można dostrzec właściwości private, o których więcej przeczytasz na stronie Douga Crockforda. Wykorzystałem tu także wzorzec modułowy do stworzenia obiektu (kiedyś opiszę kilka sposobow na produkcję obiektów) dzięki czemu nie trzeba, a nawet nie należy używać operatora new (przeczytaj dlaczego – blog YUI).

Zastosowanie

var time = yProfiler();

function test1()
{
    var n = 10000;
    for(var i=0; i < n; i++)
    {
        var a = a+a;
    }
}
time.start();
test1();
alert(time.stop());

Powyższy kod pozwala na wykorzystanie metody yProfiler.loop(). Przyjmuje ona dwa parametry – pierwszy to referencja na funkcję, która ma być wywołana, drugi – liczba wywołań tej funkcji (patrz prywatną metodę yProfiler.fLoop()). Na koniec wszystko jest wyświetlane za pomocą alertów. Jest jeszcze drugi sposób wywołania.

Zastosowanie 2

var time = yProfiler();
var n = 10000;
alert(time.loop(function(i) { var a = i+i; } ), n);

Jeśli zajrzysz do środka tego obiektu to pierwsza metoda jest niejawnym wywołaniem drugiej. Przyjemnych testów wydajności. Pamiętaj, że nie można traktować wyników jako wyroczni. Wiele zależy od przeglądarki, sprzętu i innych czynników. Nie gwarantuję także, że obiekt ten jest wolny od błędów – używasz na swoją odpowiedzialność.

Javascript jest niezwykle ekspresyjnym językiem. Istnieje w niej wiele ciekawych rozwiązań pozwalających tworzyć krótszy lub bardziej czytelny kod. W tej poradzie pokażę dwa różne podejścia do tworzenia funkcji / metod.

Sposób 1 – tradycyjny

function nazwa_funkcji_1()
{
    alert("nazwa_funkcji_1: Ja istnieje!");
}

Jeśli kiedykolwiek tworzyłeś swoje funkcje, to z pewnością zapis ten jest ci dobrze znany. Zapis ten jest używany także w PHP. Po słowie kluczoowym function należy podać ciąg znaków spełniający odpowiednie warunki (nie może zaczynać się od liczby, nie może mieć spacji itp, i td.) po czym należy podać parę nawiasów. W nawiasach można podać argumenty, ale nie trzeba.Continue reading

O literale obiektowym  kilka razy pisałem już. Tym razem napiszę o przewadze literału nad konstruktorami `Array’ oraz` Object’.

W JS można stworzyć obiekt na dwa sposoby:

Sposób I

var o = new Object();

Sposób II

var o = {};

Zaletą pierwsze sposobu jest czytelność. Każdy, nawet nie znając JS programista będzie wiedział, że `new Object()’ stworzy nowy obiekt… No chyba, że nie, zobaczmy taki przykład:

function example() { alert(1); }
example();
example = function() { alert(2); }
example();

Continue reading