Autor Zpráva
honzaik
Profil
ahoj ten titul je trochu divný ale nevím jak to jinak vysvětlit. prostě chci se zeptat, jestli je možné a pokud jak udělat aby když mám např objekt
var obj = {
 time: 0,
 realtime: this.time/100
}
toto nefunguje (realtime = NaN) ale doufám že je že zápisu vidět co chci. chci aby se hodnota realtime měnila zároveň s time. vím že to jde udělat když budu mit
var time = 0;
var obj = {
 realtime: time/100
}
ale jde mi o to jestli jde se nějak adresovat na "část" objektu ve stejném objektu. moc neznám takové ty principy přesně co je objekt atd. už přes rok programuju (dokážu v ní něco vytvořit) v javě a tohle mě docela zarazilo. něco jsem četl o objektových konstruktorech jako že definuju objekt jak funkci a pak ho vytvořím přes new Obj() a přes to by to možná šlo a to jsem četl že se to používá jen když budu mit objektů víc stejného typu.
///////////
tak jsem vykoumal že to jde udělat takhle
var obj = {
 time: 0,
 realtime: function(){
  return this.time/100
 }
}
ale musím to volat obj.realtime() a když udělám "samospouštěcí" funkci
var obj = {
 time: 0,
 realtime: function(){
  return this.time/100
 }()
}
a zavolám jen obj.realtime tak to vypíše NaN. vypadá to teda že js je nějakej "zpomalenej" v tomhle? nebo jak to jde udělat abych mohl volat jen obj.realtime? ted už mi jde o odpověď abych se něco přiučil :D
Joker
Profil
honzaik:
toto nefunguje (realtime = NaN)
Protože nejste v tom správném kontextu, this nebude ten objekt obj, ale ten v rámci kterého ten skript běží.

Například tohle by fungovalo:
var obj = { Time: 0, getRealTime: function() { return this.Time / 100; }}
Zároveň to bude dělat to co píšete, tj. že obj.getRealTime() by bylo závislé na hodnotě obj.Time.
honzaik
Profil
to jsem si myslel že v tom this bude problém. děkuji za vysvětlení
preca1
Profil
Zdravim,
přečti si, jak v JS funguje kouzelné slovíčko this. Z toho by ti mělo bejt jasný, proč nefunguje tvůj první příklad (otázka za jednoho bludišťáka: co je v this?).

Proč funguje tvůj třetí příklad (a to je podle mě správné řešení) by ti taky mělo být jasný po přečtení a pochopení slovíčka this. Definoval si na objektu funkci, která už má přístup k aktuálnímu objektu.

Kdyby si debugoval ten poslední příklad, tak by si zjistil, že si napsal skoro to samý, jako v prvním příkladu. (Opět si zjisti, co je v this.)

To, co si zmínil ty (vytvoření třídy), je něco takového:
function obj(val) {
  this.val = val;
  this.realTime = this.val / 10;
}

a = new obj(40);
a.realTime; // >> 4

A poslední řešení (bez použití funkce):
var obj2 = { // definuješ objekt a základní hodnoty
  time: 30
};
obj2.realTime = obj2.time / 100; // dopočítáš ostatní hodnoty
Neni to tak hezky napsaný, ale nejsou tam funkce, takže kdybys třeba psal herní engine, nebo něco výkonnostně náročnýho, tak to bude rychlejší :).

Další důležitá věc je, že JavaScript není Java.
honzaik
Profil
díky právě když jsem napsal napsal ten dotaz tak jsem si všiml odkazu v kódu na "this" na offic dokumentaci :D tak jsem si právě četl. všechno jsem si zkoušel v konzoli atd. to se neboj. k tý javě jsem to myslel tím že přece něco spolu maj společnýho a předpokládal že to this bude hodně podobný :D ale teď čtu "A function's this keyword behaves a little differently in JavaScript compared to other languages." hah

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: