2010-10-19 12 views
7

Soy un novato confundido. He leído en un tutorial que se crea un objeto de javascript de esta manera:¿Cuál es la diferencia entre declarar objetos javascript con var vs. con función?

function myObject() { 
    this.myProperty = "a string"; 
    this.myMethod = function() { 
     //Method code 
    } 
} 

Después leí en otro lugar que se crea un objeto de esta manera:

var myObject = { 
    myProperty: "a string", 
    myMethod : function() { 
     //Method code 
    } 
} 

Cuál es el (no subjetivo) diferencia ¿entre los dos? ¿Hay un camino correcto oficial y otro incorrecto?

Respuesta

5

Ambas declaraciones son correctas pero tienen una semántica diferente.

El primer tipo de declaración le permite crear instancias de los objetos:

var t = new myObject(); 
// then use t 
t.myProperty = "some value"; 

var otherT = new myObject(); 
otherT.myProperty = "some other value"; 

El segundo es casi como un objeto estático :

myObject.myProperty = "some value"; 
+1

prefiero llamar al segundo * singleton * sin un constructor. – galambalazs

+0

Gracias por compararlo con un objeto estático. Esa es una gran manera de explicarlo. – randomable

3

Aquí está una comparación directa ..

function myObject() { 

Esto declara la función cuando JavaScript se analiza ...

var myObject = function() { 

Esto declara la función en tiempo de ejecución.

Si usa el método "var", su función debe ser declarada antes de usarla ... intente con este ejemplo.

myFunction(); // Works 
myVarFunction(); // Boom 

var myVarFunction = function() { alert("Hi"); }; 

function myFunction() { alert("Hi"); }; 

¿Por qué utilizar el método "var" si tiene que tener más cuidado al usarlo? Todo tiene que ver con el alcance ... las funciones de ámbito se consideran mejores.

ACTUALIZACIÓN: Y hay algunos grandes explicaciones:

var functionName = function() {} vs function functionName() {}

+0

¡Gracias por ese enlace! Una respuesta decía que var tenía un alcance, pero otra respuesta lo corrigió, diciendo que ambos tienen alcance. Lo probé, y me parece que tanto el alcance de la función var como el de la misma manera. ¿O hay alguna otra condición en la que no lo hacen? – randomable

+0

@randomable - sí, el alcance en este escenario parece causar confusión ... Puedo ser otra víctima. Mira esto: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope – Fenton

0

La principal diferencia entre los dos es que una variable es local y el otro es global. "Var" básicamente define el alcance de la variable.

Cuando agregamos var a una asignación de valores variables, javascript asegura que la variable se limita a la función a la que está asignada y no colisiona con la misma variable de nombre dentro de otra función.

Cuando no usamos var, se declara como una función global y pueden producirse colisiones. Por lo tanto, siempre es aconsejable usar "var" antes de la asignación del valor de la variable. Si es necesario, use una función anónima para el cierre.

Cuestiones relacionadas