2011-03-01 19 views
9

Tengo problemas con una pregunta de Javascript desde hace un tiempo y no he podido encontrar una explicación en la web. Supongo que es porque no introduzco las palabras clave correctas que también podrían estar relacionadas con por qué estoy luchando con esto en absoluto.Las funciones de JavaScript son objetos?

Mi suposición básica es que es posible alterar objetos:

> var x = {'n': 2}; 
> x['n'] 
2 
> x['n'] = 3; 
3 

pheww que funcionó. Pero aún así (las funciones son objetos, también):

> var addn = function(a) { 
    var n = 2; 
    return n + a; 
} 

> addn(3); 
5 
> addn['n'] = 3; 
3 
> addn(3); 
5 

Esta vez no he podido cambiar 'n'. ¿Hay alguna manera de solucionar esto manteniendo el sabor funcional? A diferencia de ir completamente OO. Una pregunta relacionada que tengo sería cómo mantener las dependencias de las funciones con el fin, por ejemplo, de probar, una vez más sin OO. Debido a que estoy buscando una solución, si es posible, también me gustaría saber qué mecanismo en Javascript me hace tener problemas.

Saludos,

Marcar

responsabilidad: mencionando OO no tiene intención de decir nada en contra OO. Y tampoco intento decir nada contra VI o Emacs. Si de alguna manera hiere tus sentimientos, omita este.

+1

siempre puede pasar n como parámetro, pero asumo que no es lo que está preguntando. – Orbit

+2

¿Qué quiere decir con _ "esta vez no pude cambiar 'n'" _? ¿'Addn ['n']' devuelve '3'? –

+0

Con respecto a sus observaciones de OO: Está intentando * reinventar * OO, lo cual se ha hecho más que suficiente, incluso en JavaScript. ;) –

Respuesta

5

Si entiendo bien su pregunta, le puede dar un nombre a su función anónima y acceder a las propiedades del objeto a través de esa función:

var addn = function func(a) { 
    return func.n + a; 
}; 

addn['n'] = 3; 
addn(3); // returns 6 
+0

Puede acceder a una sola propiedad en una función anónima sin guardar una referencia al mismo, enviándola en paréntesis, es decir. '(función() {}). prototipo' –

2

Propiedades del objeto y variables locales son en gran parte no relacionada:

  • var n declara una variable que es el ámbito a la función que se encuentra en (es decir no es visible fuera de esa función (excepto a través de cierre))

  • addn['n'] añade una propiedad denominada n a addn y es equivalente a addn.n

14

Las variables privadas en el ámbito de la función, y una propiedad de un objeto son 2 cosas muy diferentes. var n dentro de esa función es completamente inaccesible desde el exterior de esa función.

Luego de que se ejecute el código, addn.n == 3, pero el valor diferente establecido en var n se inicializa cada vez que se ejecuta el funciton. Debido a las peculiaridades de javascript, una función no puede acceder realmente a sus propias propiedades muy fácil. En cambio, este patrón se lograría mejor al pasar un argumento function(n, a)

O utilice un objeto para lograr algo similar.

var adder = { 
    n: 0, 
    addn: function(a) { 
    return this.n + a; 
    } 
}; 

adder.n = 5; 
adder.addn(2); // 7 
1

Desde Javascript ámbito de la función, se puede utilizar una función para almacenar el valor de n, así:

var addn = (function(n) { 
    return function(x) { 
    n += x; 
    return n; 
    } 
}(2); 

addn(3) // 5 
addn(3) // 8 
1

Lo mejor es olvidar por completo sobre el concepto OO tradicional de "objetos" en Javascript -land, y pensar en cambio en términos de cierres. Recomiendo leer this tutorial por John Resig, el creador de jQuery.

+0

del tutorial que mencionó: ' var num = 10; función addNum (myNum) { return num + myNum; } num = 15; assert (addNum (5) == 20, "Agregar dos números juntos, uno de un cierre."); ' Creo que este es un enfoque, pero hay una cosa que no me gusta es que 'num' ya no forma parte del objeto 'addn'. – mark

0

Básicamente, todo en Javascript es un objeto. Si usted ha dicho

var a=3; 
a['n']=4; 

referencias a 'a' todavía volvería 3, pero también tiene un elemento de 'n', que tiene un valor 4. Así, cuando decimos addn['n'] = 3 va a añadir un nuevo miembro a ADDN, y no afectando la función de cualquier manera.

Recomiendo leer How good c habits can encourage bad javascript habits. Al describir todo lo que puede hacer mal, es una gran introducción a la forma en que los objetos funcionan en Javascript.

0

En primer lugar, no va a cambiar la variable de función al hacer esto:

ADDN [ 'n'] = 3;

La función que ha definido no tiene ningún nombre (también conocida como "función anónima"). Simplemente está asignando esa función a una variable llamada addn. Una variable no tiene ninguna propiedad; es simplemente un contenedor (a menos que la variable haga referencia a una matriz). Entonces, addn['n'] no devuelve nada.

Como se señaló usuario casablanca, puede nombre de su función como func y luego el acceso (y modificar) sus propiedades como func.<propertyname>.

Cuestiones relacionadas