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