|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2007
Città: Friuli
Messaggi: 154
|
[javascript] oggetti
Sto utilizzando da poco gli oggetti in javascript
E ho notato che dopo aver impostato il valore di una variabile nel costruttore, i metodi dello stesso oggetto che ho aggiunto al prototipo dello stesso oggetto non possono accedere a tali valori, risulta undefined. ES: function ContexAdmin() { this.URL = "XXX"; } ContexAdmin.prototype.handleInsertContex = function(event) { alert(this.URL); } alert stampa a video "undefined" invece che "XXX" Come mai?
__________________
iPhone4, MacBook Ultima modifica di DNAx86 : 13-09-2010 alle 18:17. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Dec 2007
Città: Friuli
Messaggi: 154
|
Qualche idea sul perché I metodi non accedono ai valori ?
Nb: conosco bene la programmazione ad oggetti tradizionale.
__________________
iPhone4, MacBook |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
Le variabili sono tutte LOCALI, ovvero se definite dentro una determinata funzione, hanno valore solo in essa. Nel tuo esempio URL è stata definita nella funzione ContextAdmin() { e potrà essere usata SOLO li dentro. L'alternativa che puoi fare è far ritornare a ContextAdmin il valore e richiamare la funzione nell'altro"oggetto" JS. |
|
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: Dec 2007
Città: Friuli
Messaggi: 154
|
Quote:
Ma dopo quello che mi hai detto sono rimasto shoccato. Ad ogni modo, quello che hai detto vale anche nelle variabili impostate nel costruttore? Perché nel mio esempio ContexAdmin() è il costruttore. Aggiungo poi che il libro dove ho studiato js mostra esempi simili al mio dove pero il metodo handleInsertContex() riesce magicamente ad accedere ai valori impostati nel costruttore. È il libro che sbaglia o sono io?
__________________
iPhone4, MacBook |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Umh... ma come istanzi l'oggetto?
Non sono un ninja in javascript, ma questo a me funziona per esempio (appena provato su chrome): Codice:
function MyObject() {
this.x = 42;
}
MyObject.prototype.testFunction = function() {
alert(this.x);
}
var obj = new MyObject();
obj.testFunction();
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Dec 2007
Città: Friuli
Messaggi: 154
|
Quote:
Codice:
var contexAdminObj = new ContexAdmin();
var ic = document.getElementById("ic");
ic.addEventListener("click", contexAdminObj.handleInsertContex, true);
è sbagliata la logica? è meglio che creo un oggetto il cui costruttore è l'handler (tipo java) ? PS: l'alert funziona se chiamo contexAdminObj.handleInsertContex() direttamente, senza assegnarla all'evento
__________________
iPhone4, MacBook Ultima modifica di DNAx86 : 14-09-2010 alle 11:33. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
Se inizializzi l'oggetto dovrebbe funzionare come ha fatto shinya. Codice PHP:
Se è un metodo mancano le () :| Se è un attributo lascio perdere e ritiro le due righe sopra scritte |
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Dec 2007
Città: Friuli
Messaggi: 154
|
Se è un metodo mancano le () :|
Se è un attributo lascio perdere e ritiro le due righe sopra scritte Si è un metodo però so che è giusto registrare un handler dentro addeventlistener senza scrivere le parentesi, questo perchè è una assegnamento di una funzione non è la chiamata di una funzione. La funzione è chiamata quando ci sarà l'evento. Tutto il problema è sorto nel mixare oggetti con hanler di eventi. Ora tra i vostri consigli e una rilettura del mio libro ho capito: cosi funziona: Codice:
ic.addEventListener("click",
function(event){ contexAdminObj.handleInsertContex(event); },
true);
__________________
iPhone4, MacBook |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
Metti risolto nel titolo |
|
|
|
|
|
|
#10 | |
|
Member
Iscritto dal: Dec 2007
Città: Friuli
Messaggi: 154
|
Quote:
[OT]: Riguardo al titolo, come si fà la modifica al titolo di un thread in questo forum? Non vedo l'opzione
__________________
iPhone4, MacBook Ultima modifica di DNAx86 : 14-09-2010 alle 12:03. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Il problema l'hai beccato da solo, ovvero dando la funzione all'event listener viene chiamata in un altro contesto, più precisamente il contesto passa dal tuo oggetto a "window". (per contesto intendo lo scope delle variabili, il significato di "this").
Quello che hai effettuato tu si chiama closure, guardatele subito e ti si aprirà un magico mondo. Senza saper usare le closure non si può dire davvero di usare javascript. ps. javascript è ad oggetti, ma di tipo prototipale, basato sugli oggetti e non sulle classi. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Guarda che non è poi cosi brutto come sembra... se poi usi librerie tipo mootools puoi scrivere codice piuttosto strutturato facilmente.
Prova anche a dare un'occhiata a javascript: The Good Parts di Crockford :P
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
Anni fa usavo mootools. Questo non ha fatto altro che accelerare il mio divorzio nei confronti di questo linguaggio |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Povero javascript.... secondo me il vostro problema è... che è javaSCRIPT...
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2010
Città: Varese
Messaggi: 996
|
Quote:
Sarà il nome? :P |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Magicamente spariscono un sacco di comportamenti strani e illogici. (poi la sintassi ci mette del suo, ma almeno la semantica diventa molto piu' pulita)
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Quote:
![]() Javascript è moooolto malleabile, impone poca roba, ci si fa di tutto e in tutti i modi, è questo forse che spaventa un pò. E' "plastico" diciamo. Javascript comunque è fortemente ad oggetti, ma non lo dovete associare ai linguaggi OO che conoscete, non è basato sulle classi, non c'è quindi il concetto di classe, variabili private, incapsulamento, super classe, ereditarietà a classi ecc ecc. E' di tipo prototipale, quindi totalmente diverso come concezione. Posso assicurare comunque, che una volta imparato ad usarlo e a "domarlo" lo si ama da quanto è stupendamente "logico". Ultima modifica di MEMon : 15-09-2010 alle 21:22. |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Codice:
obj.method() Codice:
x = obj.method x(); Se uno si accorge gli oggetti (e tutto il resto) non sono altro che hash-table, che i metodi sono in realta' funzioni, che this e'il top di uno stack aggiornato in alcune condizioni particolari, tutto diventa piu' logico e semplice da capire
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:03.



















