2012-03-17 26 views
9

supongamos que tengo una función:En javascript, ¿cómo puedo llamar a un método de prototipo en otro método 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' 
} 

Editado: de hecho el method01 así:

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

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

¿Está asignando 'method02' a un evento de una imagen por casualidad? – pimvdb

+0

Depende de * cómo * llamas a 'method02'. Debería leer el [artículo de MDN sobre 'this'] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/this). –

+0

@pimvdb: He mejorado mi pregunta, muestro cómo lo llamo – hh54188

Respuesta

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

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

Hay que conservar la referencia this en otra variable local para que la devolución de llamada función puede usarlo al llamar al otro método. La referencia this está vinculada a todas y cada una de las llamadas a funciones, incluidas las llamadas a funciones de devolución de llamada como la que está utilizando en la configuración ".draggable()". Cuando se llame this se configurará como algo diferente de this en su función "method02".

2

Sí, podría caché manualmente this en el ámbito léxico como sugieren otras respuestas en esta pregunta. Sin embargo, la alternativa que sugeriría es crear un método vinculado usando $.proxy o function.bind como su devolución de llamada.

Los métodos enlazados siempre se llaman con un estable this. Me parece que sean mucho más legible, que las referencias extraño nombrada a this en ámbitos superiores

0

cuál es sobre

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