Autor Zpráva
waltz
Profil *
cau,

je mozne pristupovat k vlastnostiam konstruktora aj vo funkciach definovanych pomocou 'prototype' ? ...pokial sa nemylim, nie je zrovna vhodne (ohladne pamate) mat nadefinovanych vela funkcii v konstruktore, pretoze kazda instancia ma v sebe okrem nadef. vlastnosti aj kopie samotnych funkcii.

priklad:

function myTree(myTreeId){
this.rootId = document.getElementById(myTreeId);
this.rootSelItem = this.rootId.view.getItemAtIndex(this.rootId.currentIndex);
this.myNumber = 5;

var that = this;
}

myTree.prototype.show = {
someValue: function(){
alert(that.myNumber); // nefunkcne, cize undefined
}
}

..za radu vopred diik....
los
Profil *
function myTree(myTreeId){
this.rootId = document.getElementById(myTreeId);
this.rootSelItem = this.rootId.view.getItemAtIndex(this.rootId.currentIndex);
this.myNumber = 5;

this.show.that = this;
}

myTree.prototype.show = {
someValue: function(){
alert(this.that.myNumber);
}
}

Zvolil si si dosť zvláštny objektový model. Prečo funkcia someValue nie je priamo v objekte myTree?
waltz
Profil *
....predpokladam, ze ked objekt myTree bude obsahovat vacsie mnozstvo funkcii a samotny objekt myTree budem casto pouzivat (bez toho, aby som pouzil pri jeho volani vsetky 'jeho' funkcie) tak to zbytocne alokuje pamat (ak sa to tak da povedat)..

Pride mi lepsie vytvorit viac prototypov, ktore budu zahrnovat tie funkcie, alebo tu mnozinu funkcii, ktore budem prave potrebovat. Co sa tyka vlastnosti, budu spolocne pre vsetky prototypy - teda funkcie.

Tejto 'problematike 'sa nevenujem dlho, takze beriem kazdu radu...
los
Profil *
Nerozumiem presne, ako chceš ušetriť tým, že funkcie jedného objektu (prototypu) rozdelíš do funkcií viacerých objektov. Po takom rozdelení budeš mať rovnaký počet funkcií, ale viac objektov - to by som povedal, že skôr zaplníš viac miesta, než je treba. Ale to je v podstate jedno, pretože rozmýšľať nad takýmto šetrením miesta je zbytočné. Jednoducho povedané: Predčasná optimalizácia je zlo.

Predpokladám, že objekt si definuješ sám - potom ale nechápem, ako môže obsahovať funkcie, ktoré nepotrebuješ.
waltz
Profil *
Skusim popisat moj zamer trochu blizsie. Jedna sa mi o vytvorenie 'nejakeho' vseobecnejsieho objektu, ktory by zahrnal nejake vlastnosti a funkcie, t. z. ze objekt moze mat aj vnorene vlastnosti (napr. ako document.getElementById('content').contentWindow.document.body).

Vnorene vlastnosti by mali reprezentovat nejaku logiku - teda popis, na ktore sa budu aplikovat nejake funkcie.

Predstavujem si rozlozenie objektu nejak takto:

function myTree(myTreeId){
this.tree = document.getElementById(myTreeId);
this.tree.getTreeItem = this.tree.view.getItemAtIndex(this.tree.currentIndex);
this.tree.getTreeItem.show = new Object(); // show 'iba' reprezentuje vlastnost, ktora odkazuje na metody
this.tree.getTreeItem.make = new Object(); // make 'iba' reprezentuje vlastnost, ktora odkazuje na metody

// funkcia pre zobrazenie nejakych hodnot
this.tree.getTreeItem.show.cellValue = function (){
..
..
}

// funkcia pre vytvorenie element
this.tree.getTreeItem.make.newItem = function (){
..
..
}

...pri takejto strukture/navrhu objektu (je funkcna, skusal som) sa vsak vzdy pri vytvoreni 'objekt = new MyTree(..)' inicializuju vsetky jeho vlastnosti a funkcie.
Co ak chcem v urcitom pripade pouzit iba funkciu 'tree.getTreeItem.show.cellValue' a v inych pripadoch zas ine funkcie objektu ?? ...doteraz som sa vsade docital, ze to 'nie je' vhodne takto robit (tak ako vo vysie uvedenom navrhu). Na to sa prave pouzivaju 'prototypy' funkcii.

..cize ked zavolam napr. 'myTree.tree.getTreeItem.make.newItem(..)' nebudu sa zbytocne inicializovat funkcie, ktore spadaju pod 'myTree.tree.getTreeItem.show'

...kazdopadne sa mi aj tak stale nedari napr. vytvorit def. prorotypovej funkcie, ako napr:

myTree.prototype.getTreeItem.make = {
newItem: function(..){
..
}
}

..neviem ci som zrozumitelne odovodnil moj zamer,...kazdopadne..za dotazy, ..pomoc...navedenie na spravnu cestu vrela vdaka ;)
los
Profil *
To, čo chceš, by zrejme mohlo vyzerať napr. nejako takto:
function myTree() {

this.make = new Make(this);
}

function Make(myTree) {
this.myTree = myTree;
}

Make.prototype = {
newItem: function() {
...
}
}


Ale stále mi nejde do hlavy, čo nevyhovuje na klasickom:
function myTree() {

}

myTree.prototype = {
makeNewItem: function() {
...
}
}

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: