Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Problema del this e dello scope

    Ciao, ho un oggetto X che richiama una funzione di un oggetto Y, in questa funzione ci sono dei riferimenti all'oggetto Y attraverso this.
    Nel momento in cui vado ad invocare tale funzione tutti i riferimenti al this presenti nella funzione puntano ad X, poichè è chiamata dal suo interno.
    Come posso far si che invece puntino ancora ad Y?

    Nel mio caso inoltre è ancora peggio in quanto il this punta a windows!

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    51
    puoi scrivere il codice in modo da capire meglio?

  3. #3
    codice:
    playerList.html
    <script type="text/javascript"> 			
    var view = new View(); 			
    var proxy = new Proxy(); 			
    var controller = new Controller(); 			 			proxy.initComponents(controller); 			
    controller.initComponents(view, proxy);
    ...

    codice:
    Controller.js
    this.initComponents = function(view,controller){
    		this.view= view;
    		this.proxy=proxy;
    	}
    
    	this.initPlayerListField = function(credentials){
    		//con this.view se faccio alert(this)  mi da [object HTMLDocument] invece che Controller
    		view.createHeader('proxy.fillPlayersCacheToInitialBlock', ... );
    Se nella funzione this.initPlayerListField scrivo come riportato qui sopra view.createHeader(... funziona, poichè la variabile è vista ovunque, se invece scrivo this.view.createHeader(... mi dice che this.view non è definita, e se vado a fare alert(this) mi da [object HTMLDocument]...

  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    E' il solito problema di javascript riguardo OOP ed enclosures e riguardo il fatto che javascript .... be' e' javascript. (non sollevo questioni ho aperto un thread a riguardo )

    cmq ti lascio 1 codice che puoi darti 1 esempio

    codice:
    var a = function()
    {
           this.publicAttr = "attr pubblico" ;
           var privateAttr = "attr privato" ;
           var self = this ; // estendiamo lo scope di this e rendiamolo disponile a tutti :D 
    
    
           this.publicMethod = function()
           {
                  alert( this.publicAttr )
                  alert( this.privateAttr )
           }
    
    
           var privateMethod = function()
           {
                  alert( this.publicAttr ) 
                  alert( this.privateAttr )
    
                  alert( self.publicAttr )
                  alert( self.privateAttr )
           
           }
    
    
    
    }

  5. #5
    grazie per l'esempio! ti volevo sottoporre del codice che ho scritto, soltanto per dirmi se è "elegante" o è una porcheria!
    Il mio obiettivo è passare una callback al server che abbia settati al suo interno dei dati. Ho pensato di creare un oggetto che non abbia riferimenti al this poichè altrimenti tale this viene inteso come WINDOWS quando il server invoca la callback, ho faccio cosi':
    codice:
    function Proxy() {
    ...
    	InOrderCallbackObject = function(object){
    		var operationAttribute
    		var descending
    		var blockSize
    		
    		this.setAttributes = function(operationAttributeV,descendingV,blockSizeV){
    			operationAttribute=operationAttributeV;
    			descending = descendingV;
    			blockSize= blockSizeV;
    		}
    	
    		this.callback = function(object){
    			...some operation...
    			var playersToShow= copyArrayPart(playersCache, 0 , blockSize);
    			controller.refreshPlayersBlock(playersToShow, elementsNumber);
    		}
    		
    	}

    Per utilizzare tale oggetto faccio cosi':

    codice:
     var callbackObject = new InOrderCallbackObject();
    	callbackObject.setAttributes(operationAttribute, descending, blockSize)
    	requestToServer(  ...some parameters... , callbackObject.callback)

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    E' uno dei tanti modi che hai per simulare gli oggetti con i relativi metodi.

    E si puo andare bene.
    Ci sono altre filosofie... ma cmq se funziona l'unica cosa ... e' che crei un oggertto proxhy con un sottooggetto inOrderCall ....
    cmq this non e' window.. e' l'oggetto stesso solo chde devi porre attenzione allo scoping nei metodi proivati. Se dichiari i metodi pubblici sei apposto . puoi usare this.attributo quanto ti pare ... solo occhio ad enclosure ed eventuali ricorsioni.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.