View Full Version : [Javascript]oggetti
Ma un oggetto di javascript non ha costruttore?
Possibile che se definisco un oggetto con dei metodi devo stare attento all'ordine in cui li inserisco?
Ad esempio:
function Oggetto(){
this.avviso("ciao");
this.avviso=function(msg){
alert("msg");
}
}
Questo non funziona perchè uso avviso() prima di averla definita...cioè non ho parole fa veramente schifo così...
Poi non riesco a rendere un metodo non accessibile dall'esterno.
Se scrivo un metodo come:
var a="pippo";
function Oggetto(){
this.a="ciao";
this.metodo=function(){
alert(this.a);
}
}
il metodo è chiamabile dall'esterno e mi mostra "ciao", mentre se faccio:
var a="pippo";
function Oggetto(){
this.a="ciao";
var metodo=function(){
alert(this.a);
}
}
Il metodo non è più richiamabile dall'esterno ma solo dall'interno, ma il bello è che se faccio:
var a="pippo";
function Oggetto(){
this.a="ciao";
var metodo=function(){
alert(this.a);
}
metodo();
}
mi stampa "pippo" !!!! Ha dell'incredibile sta cosa, javascript direi che è un po' troppo confuso.
bha... :confused:
Ma un oggetto di javascript non ha costruttore?Javascript è un linguaggio "prototype-based" (al riguardo leggi <qui> (http://en.wikipedia.org/wiki/Prototype-based_programming)). Non è object-oriented come C++, Java, ecc... Non ha il concetto di "classe" ma le funzioni possono fungere da costruttori.
Ad esempio:
function Oggetto(){
this.avviso("ciao");
this.avviso=function(msg){
alert("msg");
}
}
Questo non funziona perchè uso avviso() prima di averla definitaOvvio che non funziona ... In Javascript non c'è una vera e propria dichiarazione dei metodi. Un metodo è nient'altro che una funzione associata in qualche modo all'oggetto. Quindi prima associ la funzione all'oggetto e poi la puoi richiamare.
Se scrivo un metodo come:
var a="pippo";
function Oggetto(){
this.a="ciao";
this.metodo=function(){
alert(this.a);
}
}
il metodo è chiamabile dall'esterno e mi mostra "ciao".Questo è ok, perché hai associato la funzione al nome puntato dal this, quindi 'metodo' fa parte dell'oggetto.
mentre se faccio:
var a="pippo";
function Oggetto(){
this.a="ciao";
var metodo=function(){
alert(this.a);
}
}
Il metodo non è più richiamabile dall'esterno ma solo dall'internoCerto ... 'metodo' adesso è una semplice variabile locale, non è legato alla istanza dell'oggetto. Quando Oggetto() termina, 'metodo' sparisce.
ma il bello è che se faccio:
var a="pippo";
function Oggetto(){
this.a="ciao";
var metodo=function(){
alert(this.a);
}
metodo();
}
mi stampa "pippo" !!!!Anche qui è abbastanza logico: 'metodo' è una semplice variabile a cui associ la function. Quindi non fa parte dell'oggetto (come detto nel punto prima). Dentro quella function, il 'this' non fa riferimento alla istanza di Oggetto ma all'oggetto che potremmo chiamare "top-level", che nei browser è "window".
Se fai:
var a="pippo";
alert (window.a);Infatti stampa "pippo".
Ti vorrei chiedere un altra cosina allora :D
Sto cercando di inserire un mio metodo in una funzione già fatta, in questo modo:
function A(){
alert("ciao");
}
A.prototype.B=function(){
alert("mondo");
}
Ovviamente la funzione A non è mia, è una funzione che viene richiamata da firefox quando si chiude una TAB io vorrei inserici della mia roba perchè mi server intercettare la chiusura di una TAB e non trovo nessun altro modo valido...
Ho anche provato ad usare gli eventi ma la cosa non è pulita, ci sono eventi per così dire "spurii".
Comunque in questo modo inserisco si un metodo B() nella funzione A(), ma quando viene chiamata la funzione A() non viene chiamato anche il metodo B()... c'è un modo?
spe forse ci sono riuscito, l'ho "incapsulata" in un altra funzione, così:
function A(){
alert("ciao");
}
var temp=A;
function B(){
temp();
alert("mondo");
}
A=B;
A(); // stampa "ciao" "mondo"
Sec te com'è? un pasticcio?
mmm però nn funziona non capisco...ora non si chiudono più le TAB
Guarda qui: Code snippets:Tabbed browser (http://developer.mozilla.org/en/docs/Extension_Code_Snippets:Tabbed_Browser)
Ti ringrazio funziona alla grande! L'unico problema è che non viene notificato nessun evento di questo tipo quando chiudo il browser con le tab ancora aperte, ma ci guarderò.
Ho un problema concettuale, ho un oggetto con diversi metodi del tipo e vorrei che quando viene istanziato mi aggiunga anche degli eventi che avessero come funzione risolutiva un metodo interno all'oggetto, ad esempio:
function Oggetto(){
this.risolvi=function(event){
this.avviso("ciao");
}
this.avviso=function(msg){
alert(msg);
}
window.addEventListener("click",this.risolvi,true);
}
var o=new Oggetto();
Ecco, mi dice che this.avviso non è una funzione, in pratica sembra che la parola this si riferisce a window, infatti se creo una funzione chiamata avviso fuori dall'oggetto viene eseguita quella!
La domanda quindi è, come posso fare eseguire una funzione che chiami un'altra funzione, entrambe apparteneneti all'oggetto, quando si verifica un evento?
Perchè se la funziona è chemata da un evento viene considerata come se fosse esterna?
Per ora l'unica cosa che funziona è questa:
function Oggetto(){
this.risolvi=function(event){
this.avviso("ciao");
}
this.avviso=function(msg){
alert(msg);
}
}
var o=new Oggetto();
function gestisciEvento(event){
o.risolvi(event);
}
window.addEventListener("click",gestisciEvento,true);
Ma fa abbastanza schifo!!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.