Newsgroup: it.comp.lang.javascript
Titolo: Trasformare un oggetto in un booleano

Salve,
quando creo un oggetto con oggetto = new Oggetto(), nella funzione
costruttore verifico alcune variabili. Se sono vere allora ritorno la
creazione di un altro oggetto (quindi return new AltroOggetto()) mentre se
sono false vorrei ritornare 0 (return false). In tal caso se eseguo un
typeof, JS mi dice che è sempre un oggetto :/
Come posso fare in modo che diventi invece un false?
Max

 Come posso fare in modo che diventi invece un false?
Quello che vuoi fare tu si attua tramite il design patter "Factory". Su
google troverai tonnellate di informazioni se ti interessa approfondire
l'argomento, ma in sintesi si tratta di "definire un'interfaccia per la
creazione di un oggetto, lasciando alle sottoclassi la decisione sulla
classe che deve essere istanziata."
Molto banalmente:
	OggettoFactory={};
	OggettoFactory.create=function(){
		if (condizioni)
			return new AltroOggetto();
		else
			return false;		
	}
	var mioOggetto = OggettoFactory.create();
(ovviamente in questo caso sarebbe bastato un return con operatore
ternario, ma le condizioni potrebbero anche essere più complesse)
Se non ti interessa l'impostazione a "oggetti", perché magari hai una
struttura molto semplice, puoi sempre fare una semplice funzione. Nel web,
molte sono le funzioni "factory" scritte in js. Servono a mantenere il
codice crossbrowser.
Nota:
Solitamente, comunque, si fa tornare "null" e non "false" quando stiamo
cercando di creare un oggetto, e le condizioni per farlo non sussistono.
Spero cmq che ti sia d'aiuto questo post.
-- 
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth."
on air ~ "Unknown Artist - Everything burns"

 Spero cmq che ti sia d'aiuto questo post.
Altroché. Non ho mai lavorato con questo pattern. Lo studierò per vedere
quanto può valere :)
Thanks,
Max

 quanto può valere :)
Pensavo di inserire anche 2 eventi tipo onerror() e oncreate() ma non mi è
sembrato di trovare esempi online di pattern. Oppure anche la gestione di 2
tipi di eventi...
Qualche fonte?
Max

 sembrato di trovare esempi online di pattern.
A meno che le due funzioni non siano "generiche" per tutte le istanze
create dalla factory, eviterei. Perché altrimenti significherebbe dover
reimpostarle ogni volta, prima della creazione dell'oggetto.
Quindi, se effettivamente vanno impostate una volta sola per "ciclo
applicativo", puoi fare qualcosa del genere:
	var OggettoFactory={};
	OggettoFactory.onerror=function(){};
	OggettoFactory.oncreate=function( obj ){
		/* do something with new object "obj" */
		return obj;
	}
	OggettoFactory.create=function(){
		if (condizioni){			
			return this.oncreate ( new AltroOggetto() );
		}else{
			this.onerror();
			return false;
		}
	}
	var mioOggetto = OggettoFactory.create();
Altrimenti puoi banalmente controllare il valore di ritorno durante il
codice, soprattutto se le azioni da fare in corrispondenza di
creazione/errore variano:
var mioOggetto;
	if ( (mioOggetto = OggettoFactory.create() ){
		/* oggetto creato */
	}else{
		/* oggetto non creato */
	}
Oppure, se sei sicuro che il browser su cui deve girare questo codice
supporta il blocco try/catch, puoi sempre sollevare tramite "throw" un
errore nel caso in cui la creazione dell'oggetto fallisca.
-- 
~ Io sono il piů importante dei miei problemi.

 create dalla factory...
Si le funzioni per gli eventi di errore e creazione sono sempre gli stessi.
Solo che inizialmente onerror e oncreate possono essere undefined dato che
non mi servono... Quindi le sette in un secondo momento.
Per farti capire si tratta di un codice per Director (di Macromedia) che
utilizza Spidermonkey di Mozilla e cioé Javascript 1.5 (quindi ok x
try/catch) :)
Con il factory posso creare un xtra che può essere un xmlparser, un fileio o
una specie di xmlhttprequest... Quindi facendo "create" se esiste l'xtra mi
ritorna new xtra(nomextra) altrimenti null.
Fin qui ci siamo.
Il fatto è che l'errore generato si può dividere in 1 errore dove manca del
tutto l'xtra o 1 errore dove c'é l'xtra ma la versione è obsoleta... Questa
generazione di errore non dovrebbe rilasciare un messaggio (come in genere
si fa con i throw) ma solo un codice attraverso il quale scrivo il messaggio
a seconda se manca l'xtra o la versione è errata.
Ecco da dove nasce il caos... Pensi che dovrei generare nel create un
semplice throw eliminando i due eventi oppure gestire gli eventi insieme ad
altre 2 proprietà per nome e versione dell'xtra?
Max

 altre 2 proprietà per nome e versione dell'xtra?
Beh.. fai come ti torna più comodo. Il codice per gestire onerror/oncreate
te l'ho dato, questo è nel caso tu voglia usare il try/catch:
var OggettoFactory={
	MissingComponentException:new Error("Creation Failure : missing object"),
	ObsoleteComponentException:new Error("Creation Failure: obsolete version
of object")
};
 
OggettoFactory.create=function(){
	if ( condizione )
		throw this.MissingComponentException;
	else if ( altracondizione )
		throw this.ObsoleteComponentException;
	else
		return obj;
}
 
try{
	OggettoFactory.create();
}catch(e){ switch (e){
	case OggettoFactory.MissingComponentException:
		break;
	case OggettoFactory.ObsoleteComponentException:
		break;
	default:
		alert(e.message);
}}
O comunque qualcosa del genere, giusto per darti qualcosa su cui lavorare.
Se commenti i primi due "case", vedrai che ti viene restituito il messaggio
di errore.	


 te l'ho dato, questo è nel caso tu voglia usare il try/catch:
Il codice è semplicissimo. Ti chiedevo per un fatto di metodica.
A proposito di questo: dove trovo qualche riferimento sui vari pattern
utilizzabili con JS?
Thanks,
Max

 utilizzabili con JS?
I design pattern non sono strettamente legati ad un linguaggio. I design
pattern ti mostrano un approccio, una soluzione ad un determinato problema.
Sta a te utilizzarli nel linguaggio da te conosciuto, adattandoli secondo
le capacità di quest'ultimo.
-- 
~ La realtà è un'illusione causata dall'assenza di alcool.