Autor Zpráva
waltz
Profil *
Zdravim,

trosku sa pohravam s module patternom, ktory som na siel na http://briancray.com/posts/javascript-module-pattern a narazil som na jeden problem. Ako spravit z privatnej premennej 'n' instancnu ?? ..v nizsie uvedenom kode sa chova ako 'staticka'

<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script>
            function main() {
                var module = (function() {
                    var n = 1;
                    var module = function() {};

                    module.prototype = {
                        get : function() {
                            return n;                            
                        },
                        set : function() {
                            n++;
                        }
                    };
                   
                    return module;
                })();
                
                var o1 = new module();
                var o2 = new module();
                
                o1.set();
                
                document.writeln("res " + o1.get() + "<br/>"); // 2
                document.writeln("res " + o2.get()); // 2
            }
        </script>        
    </head>
    <body onload="main();">
    </body>
</html>

..za nasmerovanie vopred dik..
waltz
Profil *
..tak trocha som patral a vyzera to byt malinko "zlozitejsie" :| :)

http://aboutcode.net/2011/10/04/efficient-encapsulation-of-javascript-objects.html
_es
Profil
waltz:
Viď aj Časté potíže, zajímavosti a poučné debaty » Psaní metodou document.write po načtení stránky maže stránku (udalosť onload).
pako
Profil *
k premennej x sa funkcie vedia dostat vdaka uzaveru, ale nie je to vlastnost objektu o1 alebo o2. ak chces aby mala kazda instancia 'svoje' vlastnosti, zadefinuj ich v konstruktore.
                var module = (function() {
                    var x = 1;
                    
                    var Module = function() {
                        this.n = 1;
                    };
 
                    Module.prototype = {
                        get : function() {
                            return ('n:'+this.n + ' x:' + x);                            
                        },
                        set : function() {
                            this.n++;
                            x++;
                        }
                    };
               
                    return Module;
                })();
                
                var o1 = new module();
                var o2 = new module();
                
                o1.set();
                
                console.log("res " + o1.get()); // n:2 x:2
                console.log("res " + o2.get()); // n:1 x:2
waltz
Profil *
pako:
zdravim,

pouzit 'this' sice riesi funkcnost, ale neriesi problem zapuzdrenia vid. premenna 'n' ktora sa nachadza v closure...

takze mozem veselo pouzit o1.n = "cokolvek".

kazdopadne to asi nema zmysel moc riesit. Na zdrojak.cz som cital (kde su mimochodom vyborne clanky venovane JS) - "ze ono ani nema moc zmysel riesit privatne premenne - predpokladam, ze v clanku boli myslene instancne premenne - vid hore priklad".

Prikladam odkaz - http://www.zdrojak.cz/clanky/oop-v-javascriptu-i/

..viem ze existuju frameworky, ktore sa snazia nejakym sposobom umoznit vytvaranie "triedy" ako v klasickych class based languages - napr. prototype.

s pozdravom
pako
Profil *
skus sa pozriet na tento clanok http://javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/, konkretne 5. vzorby mohol riesit to co potrebujes...
joe
Profil
Asi trochu odbočím od původní otázky, ale proč to nepsat jednoduše takto (?) Já u těch odkazovaných návrhů nevidím skoro žádné výhody.

function MyModule () {
  this.id = ...;
  
  function privateMethod () {
    alert("Private");
  }
  
}

MyModule.prototype.publicMethod = function () {
  alert("Public");
};

// pak kdekoli v kódu
var myModule = new MyModule();
Chamurappi
Profil
Reaguji na joa:
Protože při každém new MyModule() vzniká nová funkce privateMethod. Kdybys mohl porovnat shodu dvou privateMethod ze dvou stejně vytvořených objektů, dostal bys false.

Druhý důvod je, že publicMethod připojená přes prototype na tu privateMethod nevidí.

Popravdě řečeno mi připadá frustrující, že se v JavaScriptu pravděpodobně doopravdy nevyplácí hrát si na privátní vs. veřejné. Vždycky si říkám, že něco asi přehlížím, že mi navzdory dlouhodobým zkušenostem stále uniká nějaká zásadní schopnost jazyka… ale už tomu přestávám věřit. Prostě je to takhle vymyšlené a jediné, co je na tom divné, je nejspíš můj údiv založený na zvyklostech z třídně-založených jazyků. Je to trochu jiné OOP.

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: