2012-03-17 13 views
9

supponiamo Ho una funzione:In javascript, come posso chiamare un metodo prototipo in un altro metodo prototipo?

function test(){} 

test.prototype.method01=function(){ 
    //do something 
} 

test.prototype.method02=function(){ 
    //how can I call the method01? 
    //this.method01()...? 
    //but the chrome through an error: 
    //Uncaught TypeError: Object #<HTMLImageElement> has no method 'method01' 
} 

Modificato: infatti il ​​method01 in questo modo:

test.prototype.method02=function(){ 
    $('.cpy').resizable({ 

    }).draggable({ 
     start:function(e,ui){ 
      this.method01(); 
     } 
    }); 
} 
+2

Stai assegnando 'method02' ad un evento di un'immagine per caso? – pimvdb

+0

Dipende da * come * si chiama 'method02'. Dovresti leggere l'articolo [MDN su 'this'] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/this). –

+0

@pimvdb: Ho migliorato la mia domanda, mostra come la chiamo – hh54188

risposta

12
test.prototype.method02=function(){ 
    var testThing = this; 
    $('.cpy').resizable({ 

    }).draggable({ 
     start:function(e,ui){ 
      testThing.method01(); 
     } 
    }); 
} 

Bisogna preservare il riferimento this in un'altra variabile locale in modo che la richiamata la funzione può usarlo quando si chiama l'altro metodo. Il riferimento this è associato a tutte le chiamate di funzioni, comprese le chiamate alle funzioni di callback come quella che si sta utilizzando nell'impostazione ".draggable()". Quando viene chiamato this verrà impostato su qualcosa di diverso dallo this nella funzione "metodo02".

2

Sì, è possibile inserire manualmente nella cache lo this nell'ambito lessicale come suggerito da altre risposte in questa domanda. Tuttavia, l'alternativa che suggerirei è di creare un metodo associato usando $.proxy o function.bind come richiamata.

I metodi associati vengono sempre chiamati con una stabile this. Trovo che siano molto più leggibile, che stranamente nome riferimenti a this in ambiti superiori

0

che cosa è circa

test.prototype.method02=function(){ 
    this.method01.apply(this); 
    // do some other stuff 
} 
Problemi correlati