recorrer objetos objeto new eliminar elemento crear buscar array agregar javascript object

new - recorrer array de objetos javascript



Javascript: referencia literal del objeto en la función de la propia clave en lugar de ''esto'' (5)

Cualquiera de estas técnicas o ambas se pueden aplicar dependiendo de la situación.

El valor de this dentro de una función depende de cómo se llamó a la función. Si llama a una función como propiedad de un objeto como este:

obj.key2(); //or obj["key2"]();

Entonces this será ese objeto. Si el objeto se creó a través de un objeto literal u otro medio no es relevante.

Pero puede usar .call() o .apply() para llamar a una función y configurarla explícitamente para algún otro objeto.

Considera también:

var obj = { key1: "it", key2: function(){return this.key1 + " works!"} }; alert(obj.key2()); // alerts "it works!" var func = obj.key2; alert(func())​; // alerts "undefined works!"

Estoy configurando func para hacer referencia a la misma función que obj.key2 , pero llamarlo como func() no establece this en obj .

Para obtener más información, eche un vistazo a lo que MDN tiene que decir al respecto .

¿Es problemático hacer referencia a un objeto literal dentro de una función que es parte de ese mismo literal? Parece funcionar bien, pero quiero asegurarme de que no haya otras implicaciones.

Aquí hay un ejemplo de lo que estoy hablando:

en lugar de:

var obj = { key1: "it", key2: function(){return this.key1 + " works!"} }; alert(obj.key2());

utilizando:

var obj = { key1: "it", key2: function(){return obj.key1 + " works!"} }; alert(obj.key2());


Habrá una diferencia en el enlace de alcance variable. Si modifica obj más tarde, modificará el valor de retorno de key2:

var newobj = obj; obj = { key1: "new" }; alert(newobj.key2());

Ahora alerta "¡nuevos trabajos!", Porque aunque está llamando a key2() en el objeto original (que ahora es newobj ), la referencia a obj.key1 ahora se une al valor de la nueva instancia de obj . Usar this evita que esto suceda.

Demostración: http://jsfiddle.net/m6CU3/


No creo que haya ninguna implicación fuera de mi cabeza. Solo asegúrate de no hacer esto accidentalmente en ningún momento:

var obj = { key1: "it", key2: key1 + " works!" }

Como eso causará un error. Aparte de eso, ¡deberías ser bueno para ir!


Si no estás utilizando un prototipo de objeto, puedes ir así. como todas las instancias de su objeto devolverán el valor de la instancia obj ...


Ambos pueden ser problemáticos.

var obj = { key1: "it", key2: function(){ return this.key1 + " works!" } }; var func = obj.key2; alert(func()); // error

Cuando func no se llama como un método de obj , this puede hacer referencia a algo más (aquí: la " window " del objeto global).

var obj = { key1: "it", key2: function(){ return obj.key1 + " works!" } }; var newref = obj; obj = { key1: "something else"; }; alert(newref.key2()); // "something else works"

Aquí accedemos al objeto desde otra referencia, aunque el obj en la función ahora puede apuntar a algún otro objeto.

Por lo tanto, deberá elegir qué caso es más probable. Si realmente quiere hacerlo seguro, puede usar un cierre donde obj tiene un alcance y no se puede cambiar:

var obj = (function(){ var local = { key1: "it", key2: function(){ return local.key1 + " works always!" } }; return local; })();

o bind() la función al objeto:

var obj = { key1: "it", key2: function(){ return this.key1 + " works always!" } } obj.key2 = obj.key2.bind(obj);