Siempre es importante el modelo de objetos
Si el modelo de objetos de Javascript es bien entendido, entonces lo siguiente se entiende:
>var a =5
undefined
a.value =9
9
>a.value
undefined
undefined
a.value =9
9
>a.value
undefined
Si no, se aprenderá el lenguaje, pero no se llegará con él al Nirvana.
- bferro's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
Rato sin estar por acá
Hace un buen rato que no andaba por estos lares. Espero no perderme nuevamente
ugh
pues sí, si se entiende el modelo de objetos de JavaScript... pero pues en mi opinión es un error que
a.value=9
no genere una excepción o algo. Eso de simplemente devolver el valor asignado (como si fuera una asignación válida), pffffff.Es una asignación válida
a.value=9
es una asignación totalmente válida.Tan válida como pfffff
undefined
>a.loQueSeTeOcurra="pfffff"
'pfffff'
>a.loQueSeTeOcurra
undefined
Javascript y la programación orientada a objetos
Estaba confundido con respecto a Javascript y la programación orientada a objetos.
Por ejemplo:
var nombre;
Simple(){this.nombre=nombre;}
function ver(){
return "Hola "+nombre;
}
}
Lo anterior no es válido en Javascript.
Esto si es válido.
this.nombre=nombre;
this.ver=ver;
}
function ver(){
return "Hola "+this.nombre;
}
objeto=new Simple("Juanito")
console.log(objeto.ver())
Muchas diferencias
Son bastante las diferencias entre un lenguaje orientado a objetos basado en clases y uno basado en prototipos. Entender esas diferencias es necesario.
this
this
en javascript es una abominación.el scoping en javascript es
el scoping en javascript es el diablo y this es una de sus victimas jeje
impide controlar la pagina
JavaScript puede llegar a ser demasiado molesto al apoderarse del foco y del control de la pagina del navegador, probe esto en internet explorer y fui incapaz de cerrar la ventana (tuve que recurrir al administrador de tareas)
while(true){
document.write("<h6>no puedes cerrarme</h6>");
alert("cierrame!")
}
}
Re: Javascript y la programación orientada a objetos
Otra manera que me parece interesante es el estilo de "arreglo", similar a un diccionario:
var obj = new Array()
obj["nombre"] = nombre
obj["ver"] = function(){
return "Hola " + this["nombre"]
}
return obj
}
var obj = person("Chano")
document.write(obj["ver"]())
eso es lo que quisiste hacer
EN IE o en cualquier browser va a funcionar de la misma manera, pues eso es lo que quieres hacer. No hay nada extraño en ese comportamiento. el browser está esperando por un evento en el dialog box que creas con alert y eso lo va a a hacer ad eternum.
This es confuso, pero no una abominación
En JavaScript,
this
dentro de una función, siempre se refiere al dueño de la función. En otras palabras,this
se refiere al objeto para el cual la función es un método de él. Si por ejemplo, escribo una función en una página HTML y la llamo de la siguiente manera:<html>
<body>
<script>
function funcion()
{
alert(this);
}
funcion();
</script>
</body>
</html>
En el alert box se visualizará
[object Window]
ya que la funciónfuncion()
se añade como método del objeto global, en este caso el objetowindow
.Lo mismo sucederá si asocio esa función con un evento disparado por algún elemento de HTML, en este caso un botón, como se muestra a coninuación:
<html>
<body>
<button type="button" onclick="funcion()">Try it</button>
<script>
function funcion()
{
alert(this);
}
</script>
</body>
</html>
Lo que se ha hecho en el código anterior es referirse a la función del objeto global, que es algo diferente (la diferencia es crucial) a si copiamos esa función para que sea un método del elemento HTML correspondiente, en este caso el botón. Para entonces especificar el alcance correspondiente de
this
, y que se refiera al elemento HTML (objeto) que queremos (en este caso el botón) tenemos que modificar la propiedad onclick de ese objeto asignando a ella la funciónfunción
como se muestra en el código siguiente:<html>
<body>
<button id ="miboton" botontype="button" >Try it</button>
<script>
function funcion()
{
alert(this);
}
var miboton=document.getElementById("miboton");
miboton.onclick=funcion;
</script>
</body>
</html>
Al dar click ahora sobre el botón, el alert box mostrará [object HtmlButtonElement].
La confusión es aun mayor cuando usamos funciones anidadas, pero tal confusión desaparece cuando llegamos a entender correctamente el scope o alcance. Me referiré a ese caso en el post siguiente.
En este ejemplo, la "confusión con this" es mayor
Escribo a continuación dos códigos. El primero de ellos es erróneo pues se está usando mal el scope de this. El segundo elimina el error, lo que puede hacerse de otras maneras también.
El primero con error:
var objeto = {
propiedad1: "Valor antes de la inicialización",
funcionInit: function () {
//Algún procedimiento para dar valor a propiedad1
this.propiedad1 = "Valor después de la inicialización";
},
funcionCargaDatos: function () {
var funcionInner=function(){
//Digamos que esta función requiere del valor de propiedad1 de este objeto
console.log(this.propiedad1);
//Otras cosas que hace funcionInner
}
funcionInner();
}
}
//Acceso a propiedad1 antes de la inicialización
console.log(objeto.propiedad1); //Imprime Valor antes de la inicialización
//Inicialización de propiedad1
objeto.funcionInit();
//Acceso a propiedad1 después de la inicialización
console.log(objeto.propiedad1); //Imprime Valor después de la inicialización
//Ejecución de funcionCargaDatos
objeto.funcionCargaDatos(); //Imprime Valor del objeto global
El segundo que elimina el error:
var objeto = {
propiedad1: "Valor antes de la inicialización",
funcionInit: function () {
//Algún procedimiento para dar valor a propiedad1
this.propiedad1 = "Valor después de la inicialización";
},
funcionCargaDatos: function () {
var self =this;
var funcionInner=function(){
//Digamos que esta función requiere del valor de propiedad1 de este objeto
console.log(self.propiedad1);
//Otras cosas que hace funcionInner
}
funcionInner();
}
}
//Acceso a propiedad1 antes de la inicialización
console.log(objeto.propiedad1); //Imprime Valor antes de la inicialización
//Inicialización de propiedad1
objeto.funcionInit();
//Acceso a propiedad1 después de la inicialización
console.log(objeto.propiedad1); //Imprime Valor después de la inicialización
//Ejecución de funcionCargaDatos
objeto.funcionCargaDatos(); //Imprime Valor después de la inicialización
si fue a propósito pero era
si fue a propósito pero era una suposición en caso se quiera desactivar a JavaScript o cerrar la pagina no podriamos directamente con alert ,confirm ,etc .y que minimizar ,maximizar y close deberían tener la preferencia.
Eso no tiene que ver con JavaScript
Ese comportamiento nada tiene que ver con lo bueno lo malo de JavaScript, o cualquier otro lenguaje con el que puedas hacer lo mismo. Tiene que ver con el diseño de la aplicación, en este caso el browser que al tener un diálogo abierto inhabilita cualquier otro evento que no esté dirigido al componente que muestra la caja de diálogo. Esa posibilidad es en ocasiones conveniente para asegurar que el usuario responde a lo que solicita el diálogo.
Nada mal usar una variable
Nada mal usar una variable para mantener la referencia de this, pero cuando el codigo empieza a crecer se vuelve un dolor de cabeza controlar las referencias globales o fuera del scope de la funcion. Una forma digamos mas "controlable" de mantener la referencia es pasandola como argumento.
var funcionInner=function(self){
//Digamos que esta función requiere del valor de propiedad1 de este objeto
console.log(self.propiedad1);
//Otras cosas que hace funcionInner
}
funcionInner(this);
emmmm los programas en
emmmm los programas en javascript son single threaded y se ejecutan dentro de un loop.. si creas un ciclo infinito bloqueas el unico thread del programa.
precisamente al diseño
a veces no es necesario o conveniente , eso era a lo que me referia por ejemplo en el registro de un usuario en pleno proceso quiera abandonar la pagina o no este seguro de sus datos se veria forzado a continuar :
var persona = prompt("por favor su nombre","--su nombre--");
if (persona!="id")
{
registro();
}
}
pero si no digo que sea culpa de JavaScript sino al mal diseño que se haga .
Prefiero "aplicar o llamar" con this
Pasar la referencia al objeto como argumento o declarar una variable local tiene el mismo efecto. El argumento es una variable local más. Utilizo ambos casos dependiendo del nivel de anidamiento de mis funciones y también utilizo en ocasiones apply, call y bind (métodos de Function prototype) para asegurarme que el this es del scope que requiero. Usando call en el ejemplo quedaría:
//Digamos que esta función requiere del valor de propiedad1 de este objeto
console.log(this.propiedad1);
//Otras cosas que hace funcionInner
}
funcionInner.call(this);
En fin que no veo abominable ni algo diabólico controlar el scope de this.