2011-03-22 11 views
7

Veo mucho que la función NO devuelve el resultado sino la función. El ejemplo siguiente muestra que la función getWindow devuelve la función. ¿Por qué no puede simplemente devolver la variable "ganar"? Cuando devuelvo el resultado y cuando funciono? Gracias.Cuando la función devuelve resultado y cuando funciona en JavaScript

var A = function(){}; 
A.prototype= 
{ 
    getWindow : function() 
    { 
     var win = new B.window(); 
     return (
       this.getWindow = function() 
       { 
        return win; 
       })(); 

    } 
} 

Respuesta

4

Este código es equivalente a su código, pero es más fácil de entender:

A.prototype = { 
    getWindow: function() { 

     var win = new B.window(); 

     this.getWindow = function() { 
      return win; 
     }; 

     return win; 

    } 
} 

Uso:

En primer lugar, crear una Un ejemplo:

var a = new A(); 

Entonces, llamada getWindow en esa instancia:

a.getWindow(); 

Aquí, se llama al método de A.prototype. Como puede ver en mi código anterior, A.prototype.getWindow creará un new B.window() y lo devolverá, sin embargo, en el medio, también creará un getWindow método en el objeto instancia sí mismo.

Ahora, si se llama de nuevo getWindow:

a.getWindow(); 

A.prototype.getWindowya no se llama porque la instancia del objeto en sí tiene un método getWindow. Este método devuelve el mismo objeto "ganador" que se devolvió cuando se llamó por primera vez al método getWindow.


Su patrón permite múltiples instancias A a utilizar el mismo método para crear una instancia A.prototype.getWindow sus propios objetos "ganar". Considere esto:

var a1 = new A, 
    a2 = new A, 
    a3 = new A; 

a1.getWindow(); // creates window W1 and returns it 
a2.getWindow(); // creates window W2 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 

a3.getWindow(); // creates window W3 and returns it 

a1.getWindow(); // returns window W1 
a2.getWindow(); // returns window W2 
a3.getWindow(); // returns window W3 

Este es un patrón bastante útil :)


Actualización:

Este es su código:

return (this.getWindow = function() { 
    return win; 
})(); 

En primer lugar, vamos a echar un vistazo en la expresión dentro de los parens:

this.getWindow = function() { return win; } 

Como puede ver, es una expresión de asignación. Se asigna un objeto de función anónimo a la propiedad getWindow del objeto al que hace referencia el this (el objeto instancia).

Tenga en cuenta que esta función devuelve el objeto win.

¡El resultado de esta expresión de asignación es el objeto de función en sí! Esto significa que el valor dentro de los parens es el objeto de función.

Ahora, vamos a echar un vistazo a la imagen completa:

return (the_function_object)(); 

Podemos eliminar los parens ya que no los necesita más:

return the_function_object(); 

Como se puede ver, la función se llama objeto, y luego se devuelve el valor de retorno de esa función.

Como se mencionó anteriormente, la función devuelve win. Por lo tanto, el código resuelve a esto:

return win; 

Así lo hace es su código:

primer lugar, se asigna a function() { return win; }this.getWindow.

SEGUNDO, devuelve el resultado de llamar a esa función que es win.

Mi código produce el mismo resultado, pero es más fácil de entender:

this.getWindow = function() { 
    return win; 
}; 

return win; 
+0

Así que si he entendido bien, una función 'directa' del tipo A se sobrescribe el prototipo de la función anterior con el mismo nombre? – pimvdb

+1

@pimvdb No - se agrega un método 'getWindow' al objeto de instancia en sí (que es' a' en el código anterior). El método 'A.prototype.getWindow' no se modifica. Sin embargo, 'a.getWindow' ahora ** sombrea ** el método' A.prototype.getWindow', de modo que este método prototipo deja de ser accesible para el objeto de instancia 'a'. –

+0

¿por qué necesito '()' al final del 'retorno'? – theateist

Cuestiones relacionadas