NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Ondřej Krsička:30.9.2016 21:28

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.9.2016 21:28
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Jan Vargovský:30.9.2016 21:54

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

 
Nahoru Odpovědět
30.9.2016 21:54
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:30.9.2016 22:00

... 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.9.2016 22:00
Avatar
Odpovídá na Ondřej Krsička
Neaktivní uživatel:1.10.2016 0:44

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
1.10.2016 0:44
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Marian Benčat:1.10.2016 0:56

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.10.2016 0:56
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Neaktivní uživatel:1.10.2016 1:03

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

Nahoru Odpovědět
1.10.2016 1:03
Neaktivní uživatelský účet
Avatar
Marian Benčat:1.10.2016 1:09

hmm. uvidime nu..

Nahoru Odpovědět
1.10.2016 1:09
Totalitní admini..
Avatar
Ondřej Krsička:1.10.2016 10:22

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

 
Nahoru Odpovědět
1.10.2016 10:22
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:1.10.2016 10:36

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.10.2016 10:36
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:1.10.2016 11:33

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.10.2016 11:33
Neaktivní uživatelský účet
Avatar
Odpovídá na Ondřej Krsička
Neaktivní uživatel:1.10.2016 11:34

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

Nahoru Odpovědět
1.10.2016 11:34
Neaktivní uživatelský účet
Avatar
Odpovídá na Jan Vargovský
Ondřej Krsička:1.10.2016 11:48

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.10.2016 11:48
Avatar
Odpovídá na Ondřej Krsička
Neaktivní uživatel:1.10.2016 13:15

Tomu rikam finale :D

Nahoru Odpovědět
1.10.2016 13:15
Neaktivní uživatelský účet
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.