Autor Zpráva
UsTruLo
Profil *
ahoj,
deklaruju pole mimo funkci, pak do pole vlozim ve funkci hodnotu.v jine funkci ulozim do tohoto pole jinou hodnotu a v tretim potrebuju znat tu hodnotu z minuleho pole(ma to svuj duvod prosim nepolemizovat zbytecne).Zkousel jsem dat pred jmeno pole & kdyz jsem do nej vkladal v jedne funkci hodnotu ale & asi neni odkazem jak jsem myslel.jak se to dela?
UsTruLo
Profil *
proste potrebuju prehodnotit tu prvni hodnotu tak aby to bylo platne i v jine funkci kde to taham
ah01
Profil
Jestli jsem to správně pochopil, tak bojujete s referencemi na objekty. V JavaScriptu (obecně v OOP jazycích - výjimku tvoří PHP4 – odtud nejspíš ten &) se nikdy nedostanete k objektu jako takovému, ale vždy pracujete pouze s referencí na daný objekt.

Např.:

var poleA = new Array("a", "b");
var poleB = poleA;

a když uděláte

poleB.push("c");

Tak vás nejspíš zarazí, že poleA i poleB obsahuje ["a", "b", "c"]. To ale není nic překvapujícího, když si uvědomíte, že proměnná poleA i poleB jsou reference na jednu instanci třídy Array.

Pokud tedy chcete aby poleB byla kopie poleA, musíte vytvořit nové pole a umístit do něj obsah poleA. Lze to vyřešit malým trikem:

var poleB = poleA.slice(0);

Metoda slice vytvoří nové pole od zadaného indexu.
UsTruLo
Profil *
diky konecne jsem pochopil par veci.ale k tomuhle pripadu mi jde o jednu zarazejci skutecnost:
deklaruji pole globalne(mimo funkci)
var pole=new Array();
function Polee(){
pole[0]="brax";
}
function Kraul(){
pole[0]=6;
}
function Paul(){
window.alert(pole[0]);
}
no timhle chci jen nastinit jaky mam problem rozhodne to neni tak jednoduche to co delam ja v tom mam zabudevane objekty atd.
ale prestoze vim ze se to vsechno vola spravne pomoci vychytavani tak mi to vypisi brax(nerikam ze tohle ale tamten slozity priklad)
ah01
Profil
Postup popsaný výše, vytvoří tzv. mělkou kopii. Pokud pole obsahuje další objekty, je v tomto případě vytvořeno nové pole, ale jednotlivé položky (reverence na objekty) ukazují opět na stejné objekty jako v poli původním. Pak potřebujete vytvořit hlubokou kopii a to je poněkud náročnější.

Asi nejjednodušší řešení je následující kód:

Object.prototype.clone = function (){
var o = new Object();
for(var property in this){
if(typeof this[property] == 'object'){
o[property] = this[property].clone();
}else{
o[property] = this[property];
}
}
return o;
}

a použití:

var poleB = poleA.clone();


Kompletní příklad:
Object.prototype.clone = function (){

var o = new Object();
for(var property in this){
if(typeof this[property] == 'object'){
o[property] = this[property].clone();
}else{
o[property] = this[property];
}
}
return o;
}

/* --- */

MujObjekt.prototype.setJmeno = function(jmeno){
this.jmeno = jmeno;
}

MujObjekt.prototype.getJmeno = function(){
return this.jmeno;
}

function MujObjekt(jmeno){
this.jmeno = jmeno;
}

/* --- */

var poleA = new Array();
poleA[0] = new MujObjekt("položka 0 poleA");

var poleB = poleA.clone(); // porovnejte s var poleB = poleA;

alert(poleA[0].getJmeno() + "\n" + poleB[0].getJmeno());
poleB[0].setJmeno("položka 0 poleB");
alert(poleA[0].getJmeno() + "\n" + poleB[0].getJmeno());


Netvrdím, že je to nejlepší řešení. Doporučuji zkusit Google (např. zde ).
UsTruLo
Profil *
dobre reseni pouziju to jinak ale tohle jsem potreboval vedet.
Neexistuje zadna metoda ktera by fungovala jako clone()?
kdyz bych totiz potreboval neco takovehleho:
var ou=new Array("Pseudoblábol");
var jdou=ou;
delete ou[0];
window.alert(jdou[0]);
window.alert(ou[0]);
tak se mi to dalsi uz nevytiskne takze potrebuju nejak vymyslet abych ho potom mohl smaznout.
proste se chci zeptat jestli kdyz to udelam takhle jak pises nebo treba jinak.napr. takhle:
function c(w) {
for (i in w) {
if (typeof w[i] == 'object') {
this[i] = new c(w[i]);
} else{ this[i] = w[i]; }
}
}
tak kdyz ten stary smaznu bude tam stale.ze se nebude jen odkazovat na ten puvodni.
Neco s tim udelam ale kdyby jsi o necem vedel tak mi usetris praci :)
Leo
Profil
Proste musite projit rekurzivne pole do nejnizsi urovne a prekopirovat hodnoty, nemuzete prirazovat pole do pole. Leo
UsTruLo
Profil *
tak jsem zjistil ze takto to funguje a hodnota tam zustane i po smazani puvodniho:
function Jdu(){
var ou=new Array("Pseudogotika");
window.alert(ou[0]);
var jdou=new C(ou);
delete ou[0];
window.alert(jdou[0]);
}
function C(w){
for(i in w){
if (typeof w[i] == 'object') {
this[i] = new c(w[i]);}else{ this[i] = w[i];}
}
}
dekuji moc za pomoc :)
Toto téma je uzamčeno. Odpověď nelze zaslat.