Autor Zpráva
quatzael
Profil
Ahoj,

jak lze prosím předat objekt (obsah toho co v sobě nese this v objektu) z metody objektu do externí funkce?
Nějak jako mám v ukázce, akorát takhle jednoduše to konkrétně bohužel nefunguje..

function doSomethingWithThisObject(obj){
obj[myVariable] = 20;
}

function myObject() {
this.myVariable = 10;
this.myMethod = methodDeclaration;
}

function methodDeclaration(){
doSomethingWithThisObject(this);
alert(this.myVariable); //mělo by zobrazit 20
}

var myActualObject = new myObject; 
myActualObject.myMethod();
      
juriad
Profil
Takto: Živá ukázka
Ale snažíš se asi o nějaké čuňačiny.
quatzael
Profil
juriad:
Díky moc za rychlou odpověď. Bohužel jsou tyhle "prasečinky" nezbytný, jinak by to bylo daleko složitější.
Trochu mě překvapilo tohle: alert(this[this.myVariable]);
Úplně moc nechápu proč tam to this je dvakrát. Chápal bych, že při předávání this se to bude chovat jako globální proměnná (objekt).

Btw. ta "živá ukázka" (resp. kod.djpw.cz) nějak úplně nefunguje správně, okno s javascriptem nejde scrollovat, takže se nemůžu dostat na konec kódu (otevíral jsem to v IE 11)
juriad
Profil
Protože this.myVariable je 10 - je to jen název proměnné. A tímto názvem musíš samotný objekt this zaindexovat.
quatzael
Profil
juriad:
Pracuju s více objekty, které jsou odlišné, ale část kódu v některých metodách je stejná. Připadá mi nelogický to několikrát do metody kopírovat. Script je potom značně delší.. Neexistuje v js nějaká možnost jako vkládání procedur, nebo eval jako v PHP?


juriad:
Jenže já potřebuju, aby ta externí funkce ve skutečnosti přímo pracovala s tím objektem.. Tzn. aby ovlivnila přímo this.myVariable v tom objektu.
Alphard
Profil
quatzael:
Neexistuje v js nějaká možnost jako vkládání procedur, nebo eval jako v PHP?
Hmm, a hledat tě nenapadlo? Nepřekvapivě i v javascriptu eval existuje, úplně stejně pojmenovaný. Nicméně, eval (bez ohledu na jazyk) je ještě mnohem horší řešení než to, cos tady napsal. Lepší bude na eval zapomenout a přemýšlet dál.

Pracuju s více objekty, které jsou odlišné, ale část kódu v některých metodách je stejná.
Tenhle popis je moc obecný, rozeberu trochu detailněji jednotlivé možnosti. Zamysli se nad tím, komu ta implementace patří. Nejde jen o výsledek! Má být daná funkčnost přímo součástí jednotlivých objektů, nebo ne?
A) Ano
A1) Zmíněné objekty nejsou až tak moc odlišné. Danou funkčnost by mohl implementovat jejich předek a na místě by byla prostá dědičnost.
A2) Zmíněná funkčnost má být součástí každého objektu, ale objekty nemají být potomky společného předka. Tady přichází na řadu traity. Uvádím to jako koncept, v javascriptu jsem je sám nikdy nepoužil, ale zřejmě bych na to šel takhle howtonode.org/traitsjs.

B) Ne
B1) Výsledné funkčnosti může být dosaženo kompozicí. Tady bude na místě polymorfismus.
B2) Na uvedenou část kódu se lze dívat jako na službu. Je v pořádku* polymorfně předat instanci nějaké funkci, které provede svoji činnost, ale mělo by jí stačit veřejné rozhraní (javascript pokud vím na private/public nehraje, chápej to ve smyslu, že externí funkce nemá mít možnost zanechat objekt v nevalidním stavu).
* Je to v pořádku, avšak typicky jako read-only. Není běžné měnit takto stav instancí, ale pokud je stav měněn pomocí veřejných metod, nevidím v tom problém.
1Pupik1989
Profil
quatzel: Nemyslíš manipulaci s vlastnostm objektu i v jiné funkci?

function doSomethingWithThisObject(obj){
obj.myVariable = 20;
}
quatzael
Profil
1Pupik1989:
Ano, přesně to mám na mysli.
quatzael
Profil
Alphard:
Hmm, a hledat tě nenapadlo?
Hledat samozřejmě umím, ale myslel jsem, že přímo funkce eval v javascriptu pouze vyhodnocuje jsony a nějaké logické operátory a ne přímo části kódů.

O dědičnosti v javascriptu jsem nevěděl, ony ty objekty se tam vůbec chovají trochu jinak než v PHP.

Ty objekty se dost od sebe liší, takže ta dědičnost ani nemá moc smysl. Jsou tam určité části stejné, tak jsem je chtěl nahradit nějakou externí funkcí, abych nemusel mít v každém objektu o 30 řádků navíc, ale když to nejde nějakým normálním způsobem, tak se prostě nedá nic dělat..
Radek9
Profil
quatzael:
myslel jsem, že přímo funkce eval v javascriptu pouze vyhodnocuje jsony a nějaké logické operátory
Vyhodnocuje jakýkoli kus JS kódu. JSON a obecně výrazy to vyhodnocuje, protože v JS je prostě můžeš jen tak napsat na řádek stejně jako příkaz.

ony ty objekty se tam vůbec chovají trochu jinak než v PHP
Chovají se dost jinak. Objektový systém v PHP funguje na třídách, v JS je postavený na prototypech. Což je v mnoha ohledech flexibilnější, v některých ohledech je to naopak trochu opruz. Ale osobně se mi s nimi pracuje lépe.

ale když to nejde nějakým normálním způsobem, tak se prostě nedá nic dělat
Alphard zmiňoval traity. Ty by tvůj problém neřešily? V JS se tomu taky často říká mixiny, na Googlu toho určitě najdeš hromady.

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: