Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Ahoj, v programu převádím souřadnice tím, že na vstupu je x a uloží se x * např. 20. Problém je ten, že já tento setter potřebuji použít i v konstruktoru, ale nějak to nefunguje. Nevíte, jak to vyřešit?

class Component {
    constructor(area, size, x, y, color) {
        this.area = area;
        this.size = size;
        this._x = x; // tady chci použít setter
        this._y = y; // tady chci použít setter
        this.color = color;
    }
    set x (x) { this._x = x * this.area.wall.size; }
    set y (y) { this._y = y * this.area.wall.size; }
    get x () { return this._x / this.area.wall.size; }
    get y () { return this._y / this.area.wall.size; }
    draw() {
        this.area.context.fillStyle = this.color;
        this.area.context.fillRect(this._x, this._y, this.size, this.size);
    }
    clear() {
        this.area.context.clearRect(this._x, this._y, this.size, this.size);
    }
    moveTo(x, y) {
        this.x = x; // tady jsem použil setter
        this.y = y; // tady jsem použil setter
    }
}
 
Odpovědět 30. září 21:28
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Jan Vargovský:

Moc nechápu co máš za problém, když chceš použít setter tak použij setter ne? :D

 
Nahoru Odpovědět 30. září 21:54
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

... to UX když ti vyprší platnost a nemůžeš ani přidat nový koment, protože si to myslí, že edituješ :D 11/9 ...

"EDIT": Jo už jsem si všiml "nějak to nefunguje" ... zkus se vyjádřit trošku lépe.

 
Nahoru Odpovědět 30. září 22:00
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Taskkill:

Jde o to, ze to nemuzes. Nejde ani tak o getter a setter samotnej, jako o to, jak probiha konstrukce objektu v javascriptu. Ve zkratce, clenske promenne x resp y a jejich accessory (get a set) nejsou v tento moment objektu jeste prirazeny.

Jak to resit? Muzes ony gettery a settery definovat v konstruktoru, hnusne ale ucinne.

Jak to resit lepe? Muzes si napsat takovy pre-setter, rekneme ze nadefinujes statickou metodu, ktera bude dostavat value od setteru, bude tedy setterem vzdy zavolana a vrati (pouze vrati) hodnotu, o neco vetsi, mensi, vynasobenou, zkratka presunes tu logiku ze setteru do pre-setteru. No a setter samotny, uz jen nastavi co je potreba.
V constructoru pak nebudes volat setter, ale do one skryte property objektu ulozis rovnou hodnotu, kterou ti vrati pre-setter, ten muzes volat libovolne, protoze je static.

Spichnul jsem funky fiddle. Tak se muzes kouknout, kdyby nebylo jasne, o cem jsem to mluvil.
https://jsfiddle.net/…ll/uafrqp88/

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +2 1. října 0:44
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Taskkill
Marian Benčat:

aneb kdyz mame nepouzitelny jazyk, tak to za autory musi vymyslet programator.. a proto uz JavaScript bude jednou pro vzdy pouze bytecodem JSVM do ktereho se budou prevadet rozumne meta jazyky..

 
Nahoru Odpovědět 1. října 0:56
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Marian Benčat
Taskkill:

No ja osobne doufam, ze bytecodem webu nebude JavaScript ale WebAssembly. Kdyz uz na tom makaji vsichni hlavni hraci spolecne.

 
Nahoru Odpovědět  +2 1. října 1:03
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

hmm. uvidime nu..

 
Nahoru Odpovědět 1. října 1:09
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Už aby vyšlo to webassembly. Dík za prakticky okamžitou profi odpověď. :)

 
Nahoru Odpovědět 1. října 10:22
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Taskkill
Jan Vargovský:

uhm ... proč bych to nemohl použít takhle? :-`

class A {
  constructor(value) {
    this.size = 10
    this.x = value
  }

  get x() {
        return this._x / this.size
  }

  set x(value) {
        this._x = value * this.size
  }
}

var a = new A(5)
console.log(a)
 
Nahoru Odpovědět 1. října 10:36
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Jan Vargovský
Taskkill:

Protoze to neni to co chce.

On nechce do this._x ulozit hodnotu x, on tam chce ulozit vysledek nejakeho slozitejsiho vyrazu. Presne to co mas napriklad ve svem setteru. Jinymi slovy, uz v konstruktoru chce ulozit onu upravenou promennou. Sice to z jeho kodu neni jasne videt, ale da se to odvodit z jeho pozadavku na pouziti setteru v constructoru. Ja jsem to tak pochopil.

 
Nahoru Odpovědět  +1 1. října 11:33
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Taskkill:

Vsak z C/C++ uz si kompilovat muzes, experimentalne samozrejme s polyfilem do asm.js.

 
Nahoru Odpovědět 1. října 11:34
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Jan Vargovský
Ondřej Krsička:

Jaj, trochu trapné. Chybu jsem měl jinde :-` Až příště večer nebudu vědět, nechám to radši na ráno / po škole a nebudu s tím hned někoho obtěžovat :D

 
Nahoru Odpovědět 1. října 11:48
Avatar
Taskkill
Redaktor
Avatar
 
Nahoru Odpovědět  +1 1. října 13:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.