Autor Zpráva
vojja01
Profil *
Dobrý den,
V javascriptu programuji relativně nově a potřebuji napsat kostru objektu.
Je to poměrně jednoduché, vytvořím instanci s jedním parametrem a potom využívám růzdné metody tento parametr využívající. Bohužel po všech článcích, které jsem přečetl a příkladech, které jsem projel, se mi pořád nedaří a stále narážím na nějaké banální chyby. V javascriptu je to oproti třeba PHP složitější, co jsem se dočetl, i podle zkušenosti.
Neporadil by mi někdo? :) Předem díky.
Chamurappi
Profil
Reaguji na vojju01:
Neporadil by mi někdo? :)
Určitě poradil, ale musíš upřesnit, co vlastně chceš vědět.
vojja01
Profil *
Úplně základní syntaxi :)
_es
Profil
vojja01:
Nenapísal si, čomu konkrétnemu nerozumieš. Nejaké výukové materiály do tohoto vlákna ti tu asi nikto prepisovať či kopírovať nebude.
juriad
Profil
Ukaž třeba kus kódu, který ti nefunguje. Nejspíš se dočkáš seznamu chyb a zůsobu jejich řešení.
vojja01
Profil *
Výukové materiály jsem studoval, úplně hned bych sem nepsal, ale každý píše nějaký jiný způsob psaní těch objektů.
_es
Profil
vojja01:
každý píše nějaký jiný způsob psaní těch objektů.
No tak je veľa spôsobov, použiješ spôsob, ktorý si myslíš, že je na konkrétny účel vhodný. V JS to je niekedy také „kostrbaté“ voči niektorým iným jazykom. Ktorému konkrétnemu „spôsobu písania“ nerozumieš?
vojja01
Profil *
třeba:
function App(dia) {
 unLoad = function() {
  skrytDialog(dia);
 }
}
var facebook = new App("facebook");
facebook.unLoad(); //vypíše facebook.unLoad is not a function



Právě, nevím, který je vhodný a ani jim všem pořádně nerozumím.
Someone
Profil
function App(dia) {
    this.unLoad = function() {
        skrytDialog(dia);
    }
}
vojja01
Profil *
Aha, děkuji, to funguje. Pamatuju si, že když jsem tam to this psal, házelo to další chyby. Tak teď snad nebudou problémy..
Chamurappi
Profil
Reaguji na vojju01:
V otázkách OOP v JS jsem si stále trochu nejistý, ale dobře, někdy to popsat musím…

Konstruktor je libovolná funkce. V this je při jeho jejím zavolání s operátorem new na začátku prázdný objekt, který má interně uloženo, že je instancí konstruktoru. Metody na instancích můžeš vytvářet dvěma způsoby:

1) Přímo v konstruktoru, tak, že přiřadíš funkci do this.jménoMetody. Výhodou je, že tato funkce vidí na argumenty konstruktoru a i na jiné lokální (chceš-li privátní) proměnné a funkce, které jsou definované uvnitř konstruktoru. Nevýhodou je, že se při každém vytváření instance vytváří všechny metody znovu.

2) Navěšením na prototype, tedy tak, že přiřadíš funkci do Konstruktor.prototype.jménoMetody. Výhodou je, že tato funkce je pak společná pro všechny instance. Nevýhodou, že nemá žádný exkluzivní přístup k objektu, tzn. může pracovat jen s veřejně dostupnými členy, stejně jako jakákoliv cizí funkce, které se dostane instance objektu do spárů.

Metody vidí v this objekt, na němž jsou vyvolávané, což nemusí být nutně ten, na kterém jsou definované (lze je tedy přenášet mezi objekty). Viz Co znamená a jak se používá v JavaScriptu this?
Konstruktor může obsahovat return vracející objekt (jakýkoliv neprimitivní typ), v takovém případě je výsledkem konstruování tento náhradní objekt.

Zapomněl jsem na něco?
_es
Profil
Chamurappi:
Zapomněl jsem na něco?
„Reťazenie“ prototypov, nové možnosti práce s objektami z ECMAScript5,... To by už z toho bola asi kapitola učebnice. V niektorej literatúre z toho robia takú „vedu“ že sa toho chudák začiatočník môže až zľaknúť.
pako
Profil *
[#12] _es:
Ked som sa prvykrat dostal k dedicnosti tak som tu kapitolu naozaj preskocil ;)

[#11] Chamurappi:
Konstruktor může obsahovat return vracející objekt (jakýkoliv neprimitivní typ), v takovém případě je výsledkem konstruování tento náhradní objekt.
Len dodam, ze v tomto pripade sa neda vyuzit prototyp konstruktora, kedze pri vrateni ineho objektu, ako toho, ktory sa vytvori implicitne, neexistuje vazba medzi prototypom konstruktora a vratenym objektom.
_es
Profil
pako:
v tomto pripade sa neda vyuzit prototyp konstruktora
Ale teoreticky sa môže vrátiť aj objekt, kde bude ten prototyp konštruktora v postupnosti prototypov vráteného objektu.
Chamurappi
Profil
Reaguji na _es:
‚Reťazenie‘ prototypov
To prakticky znamená, že do vlastnosti prototype přiřadím nějaký jiný objekt, ale jinak je ta logika vlastně pořád stejná, ne? Všechno, co je v prototype, je automaticky vtisknuto do vytvářeného objektu a je jedno, jestli je to jedna metoda, nebo shluk všelijakých jiných členů (tedy objekt). Když dám do prototype instanci nějakého objektu, tak jeho konstruktor zase může mít svůj prototype atd., v tom už žádná hlubší věda není. Žádné další speciální pravidlo. (Akorát teda instanceof dokáže proplout skrz neviditelné názvy konstruktorů všech zahnízděných prototypů, to trochu speciální je.)

V niektorej literatúre z toho robia takú ‚vedu‘ že sa toho chudák začiatočník môže až zľaknúť.
Nejen začátečník :-)
Myslím, že hodně učebnic dělá chybu, že kouká na prototypové OOP očima třídního OOP a snaží se v něm vidět podobnosti a spíš porovnávat oba přístupy, místo toho, aby popsaly prototypové OOP od nuly.


Reaguji na paka:
Dobrá připomínka.
Jan Tvrdík
Profil
vojja01:
Jsi-li schopen číst technickou angličtinu, tak doporučuji článek sporto.github.io/blog/2013/02/22/a-plain-english-guide-to-javascript-prototypes.
_es
Profil
Chamurappi:
Akorát teda instanceof dokáže proplout skrz neviditelné názvy konstruktorů všech zahnízděných prototypů, to trochu speciální je.
„Preplavuje“ sa to aj pri obyčajnom čítaní nejakej vlastnosti, postupne sa prehľadávajú všetky prototypy objektu na názov vlastnosti, nie len pri operátore instanceof.

hodně učebnic dělá chybu, že kouká na prototypové OOP očima třídního OOP a snaží se v něm vidět podobnosti
Píše sa tam o „triedach“, „privátnych vlastnostiach“, ... a chudák čitateľ vidí v kóde len funkcie, obyčajné premenné, ...
pako
Profil *
[#14] _es:
To ma vobec nenapadlo, uvazoval som pripad objektu tvoreneho ako literal alebo new Object. Pre zaujimavost prikladam riesenie, ktore som nakoniec vytvoril, aj ked tu nevidim ziaden prakticky prinos.
function inherit(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

function P(name) {
    var o = inherit(P.prototype);
    o.name = name;
    return o;
}

P.prototype.say = function() {return this.name;};

var obj = new P('pako');

console.log(obj instanceof P); // true
console.log(obj.say()); // 'pako'
1Pupik1989
Profil
Zbytečné předávat prototype v konstruktoru.

function inherit(o) {
    function F() {}
    F.prototype = o;
    return new F();
};
 
function People(){};
People.prototype.name = 'anonymous';
  
 
function Person(name,sex) {
  this.name = name || this.name;
  this.sex = sex || this.sex;
  return this;
};
 
Person.prototype = inherit(People.prototype);
Person.prototype.sayName = function() {return this.name;};
 
var obj = new Person('pako');
 
console.log(obj instanceof Person); // true
console.log(obj instanceof People); // true
console.log(obj.sayName()); // 'pako'

obj = new Person();
 
console.log(obj instanceof Person); // true
console.log(obj instanceof People); // true
console.log(obj.sayName()); // 'anonymous'
_es
Profil
pako:
nevidim ziaden prakticky prinos.
V konštruktore by sa mohlo vetviť, aký prototyp bude mať vrátený objekt. Napríklad by prototyp konštruktora mohol byť až druhým v poradí konštruktorov a pod. nápady.

1Pupik1989:
Zbytečné předávat prototype v konstruktoru.
Išlo o reakciu na [#14] _es <- [#13] pako <- [#11] Chamurappi
1Pupik1989
Profil
Nicméně pořád nemá cenu vytvářet instanci objektu, která je hned zahozena. Čili to co je v P může být v jakékoliv funkci.

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: