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.getWindow
ya 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;
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
@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'. –
¿por qué necesito '()' al final del 'retorno'? – theateist