2012-05-31 21 views
5

¿Hay alguna diferencia entre estos dos:¿Cuál es la diferencia entre esos dos?

var test1 = function() { 
    this.method1 = function() {} 
} 

y

var test2 = function() {}; 
test2.method1 = function() {}; 
+4

Sí. Error de sintaxis: 'var test2 = function();' – diolemo

+0

@diolemo Solucioné el error de sintaxis. – Triptych

Respuesta

4

El primer fragmento de toma this objeto, lo que sea, y asigna una función a su ranura (campo) llamado method1.this pueden representar diferentes objetos, dependiendo de cómo test1 se llama:

  • cuando llama como una función independiente - test1() - this habrá window
  • cuando llama como un constructor - new test1() - this se refiere a el objeto que está siendo creado
  • cuando se llama a través de call o apply-test1.apply(someObject) - this se refiere al argumento

El segundo fragmento toma el objeto test2 y asigna una función a su ranura denominada method1.

1

La primera forma es un constructor que crea más objetos y necesita tener la new palabra clave:

var mytest1 = new test1(); 
mytest1.method1(); 

La segunda forma está lista para usar de inmediato:

test2.method1(); 
+4

Tenga en cuenta que 'test1' no es necesariamente un constructor. Se podría usar como uno, pero también podría estar destinado a ejecutarse en el contexto de un objeto existente. – apsillers

0

Suponiendo que la sintaxis era correcta, la primera es un constructor que da a todos los objetos test1 creados a través de new test1() un método llamado method1. El segundo solo agrega una función al objeto constructor. En javascript, las funciones son objetos que pueden tener propiedades (incluidos los métodos).

0

La primera versión realmente crea un método disponible para todos los objetos instanciados de este modo:

var o = new test1(); 
o.test1(); 

El segundo simplemente adjunta una función como un atributo de la función test2. Si está familiarizado con otros lenguajes OO basados ​​en clases, esto funciona como un método estático. No tendrá acceso al puntero this en el segundo ejemplo.

0

La primera de ellas:

var test1 = function() { 
    this.method1 = function() {} 

}

Define la función "test1". Una vez (y solo cuando) se llama "test1", "this.method1" se definirá como una función, que no hace nada.

El segundo:

var test2 = function() {}; 
test2.method1 = function() {}; 

crear la función "test2" y al mismo tiempo define la función "test2.method1", sin la necesidad de invocar la primera función.

0

El primero establece la propiedad method1 en lo que invoque test1().

El segundo define una función de vacío y establece la propiedad method1 en test2

Cuestiones relacionadas