2011-12-23 12 views
6

consideran este código:¿Está utilizando lo nuevo en Javascript lo mismo que no usarlo?

function klass(z) { 
    this.a = z; 
    return this; 
} 

var b = klass(5); 
var c = new klass(9);

Cuando lo ejecuto en Chrome y registro en la consola, b resulta ser de tipo DOMWindow, mientras c es de tipo klass.

Aunque ambos tienen la propiedad de una, eficazmente tanto ser un ejemplo de klass.

  • ¿Está usando o no usando nuevo, lo mismo?
  • ¿Es lo mismo en este ejemplo pero diferente en otras situaciones?
  • ¿Hay diferencias en la eficiencia o el comportamiento?
+0

Niza pregunta, me gustaría saber esto también. –

+3

Simplemente por la información en su pregunta, obviamente no son lo mismo, porque los objetos resultantes tienen diferentes tipos. Si investigas qué otras propiedades tiene la primera, verás la diferencia ... – nnnnnn

Respuesta

6

Cuando se invoca una función como esta

klass(6); //called function invocation 

this se ajustará al objeto global, o, si se encuentra en modo estricto, undefined

Como resultado, la primera ejemplo (sin el new) devolverá el objeto global con una nueva propiedad a adjunta. En modo estricto lanzará un error ya que this se establecerá en undefined, y no puede agregar una propiedad a al undefined.

Cuando se invoca una función con new

new klass(9); //called constructor invocation 

el valor this se establece en un nuevo objeto, y es implícitamente regresado de la función-no hay necesidad de decir return this

Para completar , cuando invoca una función como método en un objeto:

foo.method(); //called method invocation 

this se establecerá en el objeto- foo en este caso.

Y cuando se invoca una función con aplicar (o llamar)

method.apply(foo) //called apply invocation 

this se ajusta a lo que usted specify- foo nuevo

EDITAR

he mencionado en mi respuesta strict mode . Una página usa el modo estricto si tiene

"use strict" 

en la parte superior.

+0

¿Cómo obtengo el modo estricto? – Thilo

+1

@Thilo - ver edición –

+0

+1, pero en su segundo párrafo creo que usted quiso decir "esto" se establecerá ... " – nnnnnn

3

No hay absolutamente el mismo:

var a = klass(42); 
console.log(a.a); // 42 
var b = klass(69); 
console.log(b.a); // 69 
console.log(a.a); // 69 

Si usted no llama new, usted no está consiguiendo nada nuevo.

+1

* "Si no llama nuevo, no obtendrá nada nuevo". * Profundo en su simplicidad. :) –

+0

Pero, por supuesto, puedes crear nuevos objetos sin 'nuevo' en JS. – Kos

6

Sin el new, su función solo operará en lo que this estaba obligado a, en su caso, la ventana DOMW. No se crea ninguna instancia nueva, la propiedad a se establece en el objeto ventana. Llamar al método dos veces reduce el resultado anterior.

Prueba esto:

var b = klass(5) 
log.info(b.a) 
log.info(b == window) // b is actually the window object 
log.info(window.a) // also 5 

var c = klass(6) 
log.info(b.a)  // now set to 6 
log.info(c == b) // c and b are the same 
Cuestiones relacionadas