2012-03-20 6 views
7

consideran este código:¿por qué la creación de instancias en línea se comporta diferente?

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
} 

(new Foo()).alert(); 

cuando se ejecuta (en jsFiddle), la alerta indica que 'esto' es el objeto de la ventana. Cambiar la última línea a:

var foo = new Foo(); 
foo.alert(); 

funciona como se esperaba.

¿Por qué es la diferencia?

+0

js Demo de Fiddle. Parece que la segunda 'alerta' no se ejecuta: http://jsfiddle.net/sf3M3/ –

Respuesta

4

Parece que le falta un punto y coma:

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}; //Semi-colon here! 

(new Foo()).alert();​ 

He aquí una fiddle en la que parece funcionar como se espera.

Lo que está sucediendo es que el método alert se llamó de inmediato, con una nueva instancia de Foo pasado a él, y alert continuación, se llama en el valor de retorno (que es undefined):

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 

Como @Nemoy ha mencionado, si solo usa new Foo().alert() obtendrá el comportamiento esperado porque la inserción automática de punto y coma colocará un punto y coma en el lugar correcto para usted (la falta de un punto y coma no cambia el significado del código). Y como el operador new tiene la precedencia más alta, los paréntesis no son necesarios.

6

Su código es en realidad:

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 

Debido a la falta punto y coma, agregue un punto y coma y se ejecutará correctamente.

+0

+1 Me pegó. Esta es una de las ** muchas ** razones para no confiar en el horror que es [inserción automática de punto y coma] (http://es5.github.com/#x7.9). –

Cuestiones relacionadas