Autor Zpráva
waltz
Profil *
Cau,

v nizsie uvedenom kode sa snazim vytvorit vlastnost/metodu 'this.rootSelItem.getSomeValue()' v ktorej chcem pouzit vlastnost
'this.myNumber' definovanu v konstruktore. Uz som skusal rozne zapisi, ale stale sa mi nedari vypisat hodnotu '5'. Vysledok je vzdy 'undefined'.
Pokial pouzijem def. ako 'this.getSomeVelue' tak je to v poriadku. Mne sa vsak jedna prave o dlhsi/vnoreny zapis vlastnosti - t. z., chcem mat viac vnorenych vlastnosti na ktore chem aplikovat tozne metody.

...uz sa dlhsie neviem dopracovat k vysledku, .....jedine co pomohlo, bolo pouzit 'new Object()'....ale to uz nie je zapis triedy.

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

this.rootSelItem.getSomeValue = function (){
return this.myNumber;
}
}

function onTreeClick(){
var tree = new myTree('treeRoot');

alert(tree.rootSelItem.getSomeValue());
}

za pomoc vopred diik
ah01
Profil
Problém je v tom, že pokud zavoláš tree.rootSelItem.getSomeValue(), tak za this se ti dosadí tree.rootSelItem, který ale žádnou vlastnost myNumber nemá. Asi nejjednodušší co můžeš udělat je následující úprava:

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

var that = this;
this.rootSelItem.getSomeValue = function (){
return that.myNumber;
}
}
Vytvoříš si novou proměnnou that s referencí na aktuální objekt this (využíváš vlastnost zvanou closure).

PS: „pouzit 'new Object()'....ale to uz nie je zapis triedy“ – v JS žádné třídy známé z PHP čí Javy nejsou, takže je otázka, v čem by nějaké použití new Object() mělo být na škodu.
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
ah01
Profil
No to pochopitelně nemůžeš. that je lokální proměnná fce. myTree. Jak by si k ní chtěl přistupovat v úplně jiné fci.

S tou paměťovou náročností bych to neviděl tak zle. Používají se koncepty, které vůbec prototype nepoužívají (např. Module Pattern). Pokud tě to zajímá víc, můžeš se kouknout jak to řeší Prototype framework nebo MooTools framework (oba vycházejí z knihovny Base). Zkus si to najít a kouknout se na to. Když tak se ptej dál.

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:

0