Vlastnosti u objektů (getters a setters)

by 3 contributors:

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,