2011-09-05 10 views
6

Lectura a través de la documentación de jQuery sobre el objeto evento y su constructor $.Event() veo:opcional `operador new`

new El operador es opcional [al llamar al constructor].

¡Eso es genial! ¿Cómo es que la gente jQuery hizo tal truco?

Respuesta

7

John Resig explica esto muy bien: http://ejohn.org/apps/learn/#36 y http://ejohn.org/apps/learn/#38

Básicamente, Event es una función y un objeto (las funciones son objetos). La primera línea de evento verifica si se está llamando como una función o como una instancia del objeto Evento (con el nuevo operador).

Si usted está buscando específicamente cómo jQuery lo hace, mira a la línea 3134-3138 de la jQuery source:

jQuery.Event = function(src, props) { 
    // Allow instantiation without the 'new' keyword 
    if (!this.preventDefault) { 
     return new jQuery.Event(src, props); 
    } 

Y explicación de esto es el the jQuery forms.

Básicamente, en las líneas 3178-3194 el evento preventDefault se agrega al prototipo del evento. Si se crea una instancia del evento con new, se le asignará este método preventDefault. De lo contrario, no será definido.

+1

¿Qué es 'this.preventDefault'? – Randomblue

+0

Revisa mi publicación para una actualización. –

3

Cualquier función de JavaScript definida por el usuario puede invocarse con o con el operador new. Sin new, funciona como una función normal (porque es lo que es). Con new, el intérprete crea un objeto nuevo con el prototipo establecido de forma adecuada, y convierte ese objeto en el parámetro this de la llamada. Este objeto nuevo es el resultado del operador new - excepto si el cuerpo de la función return es un valor explícitamente; entonces el valor devuelto gobierna.

Así que si usted escribe

function foo() { 
    return { bar: 42 }; 
} 

se le puede llamar ya sea sin o con new - no hay diferencia porque el cuerpo vuelve siempre explícitamente un valor, y nunca utiliza su this.