mozilla
Your Search Results

    Vlastnosti u objektů (getters a setters)

    V pokročilejších objektových jazycích existují u objektů kromě jejich atributů (attributes, fields nebo members) také vlastnosti (properties). Vlastnost vypadá "zvenku" stejně jako atribut, ale ve skutečnosti se při přístupu k ní zavolá definovaná metoda – jedna pro čtení (getter), druhá pro zápis (setter).

    Kdy se používání vlastností hodí?

    • Když chcete po přiřazení vlastnosti zároveň vykonat nějakou akci – vykonáte ji v metodě pro zápis.
    • Když chcete hodnotu vlastnosti dynamicky spočítat (například proto, že její výpočet není triviální a k vlastnosti se přistupuje málokdy, takže je zbytečné její hodnotu počítat již při vytváření objektu). Snadno se tak implementuje cache.
    • Když chcete, aby daná vlastnost byla pouze pro čtení – jednoduše nedefinujete metodu pro zápis.

    Příklad kódu – jednoduchý objekt, který má jako vlastnosti souřadnice středu (vlastnosti x a y) a velikost (vlastnost size), a podle nich nastavuje CSS vlastnosti obrázku v HTML stránce, který ho reprezentuje (vlastnost image):

    Ball.prototype = {
      /* Gettery jen vrátí hodnotu atributu objektu. Settery po nastavení navíc
      opraví pozici asociovaného obrázku v HTML dokumentu. */
      get x() { return this.mX; },
      set x(value) { this.mX = value; this.redraw(); },
      get y() { return this.mY; },
      set y(value) { this.mY = value; this.redraw(); },
      get size() { return this.mSize; },
      set size(value) { this.mSize = value; this.redraw(); },
    
      redraw: function() {
        this.mImage.style.left = (this.mX - this.mSize) + "px";
        this.mImage.style.top = (this.mY - this.mSize) + "px";
        this.mImage.style.width = (2 * this.mSize) + "px";
        this.mImage.style.height = (2 * this.mSize) + "px";
      }
    }
    
    /* Konstruktor. */
    function Ball(x, y, size, image) {
      this.mX = x;
      this.mY = y;
      this.mSize = size;
      this.mImage = image;
      this.redraw();
    }
    

    Gettery i settery jde u každého objektu také definovat dynamicky, pomocí speciálních metod __defineGetter__ a __defineSetter__. U obou metod je prvním parametrem název vlastnosti a druhým funkce, která getter či setter implementuje (v JavaScriptu je funkce také objekt, takže ji lze předat jako parametr).

    V následujícím příkladě definujeme všem objektům typu Date vlastnost year.

    var d = Date.prototype;
    d.__defineGetter__("year", function() { return this.getFullYear(); });
    d.__defineSetter__("year", function(y) { this.setFullYear(y); });
    

    Informace o původním dokumentu

    • Autor: David Majda

     

    Document Tags and Contributors

    Contributors to this page: wqa, Pawell, Majda
    Last updated by: wqa,