Foros del Web » Programando para Internet » Javascript »

Duda existencial sobre el uso de "this"

Estas en el tema de Duda existencial sobre el uso de "this" en el foro de Javascript en Foros del Web. Hola a todos, Estoy aprendiendo javascript y me encuentro con una duda que raya en lo existencial, no logro comprender el uso del this, sobre ...
  #1 (permalink)  
Antiguo 30/04/2015, 14:23
 
Fecha de Ingreso: septiembre-2006
Mensajes: 22
Antigüedad: 17 años, 7 meses
Puntos: 0
Sonrisa Duda existencial sobre el uso de "this"

Hola a todos,

Estoy aprendiendo javascript y me encuentro con una duda que raya en lo existencial, no logro comprender el uso del this, sobre todo en este ejemplo:

Código HTML:
<!DOCTYPE Html>
<html>
	<head>
		<title>Ejemplo de funciones con return</title>		
		<script type="text/javascript">	
			function areaCirculo(radio){
				this.radio = radio
				return 3.1416 * (radio * radio);
			}
		</script>
	</head>
	<body>
		<script type="text/javascript">
			var radio = radio
			var resultadoAreaCirculo = areaCirculo(8);
			document.write("El area de un circulo de radio " + radio + " es " + resultadoAreaCirculo);
		</script>
	</body>
</html> 
La idea es averiguar el área de un círculo, cuyo radio en este caso es 8, para esto creo una función que hará la operación matemática y me devolverá el resultado, resultado que mostrare en la página por medio de "write".

El asunto es que además de mostrar el resultado, quiero mostrar el radio que se uso para calcular el área del círculo, así que necesito recuperar ese valor que pase como parámetro a la hora de llamar a la función.

El ejemplo lo estoy siguiendo de este video: https://www.youtube.com/watch?v=EWYU_DDSdi8

Creo que esta bien explicado pero aún asi no logro entender porque usar this.

Le puse algunas gráficas para explicarme mejor:



De la imagen, los números 1, 2 y 3 ¿son correctos?

Agradecería enormemente que me pudiesen ayudar con esto.

Saludos.
  #2 (permalink)  
Antiguo 30/04/2015, 14:31
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 7 meses
Puntos: 578
Respuesta: Duda existencial sobre el uso de "this"

Un uso totalmente absurdo e innecesario del this. No veas tutoriales de ese tipo

Si quieres comprender bien el uso de this deberías mirarte la parte orientada a objetos de JavaScript.
  #3 (permalink)  
Antiguo 30/04/2015, 17:33
 
Fecha de Ingreso: septiembre-2006
Mensajes: 22
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Duda existencial sobre el uso de "this"

Cita:
Iniciado por PHPeros Ver Mensaje
Un uso totalmente absurdo e innecesario del this. No veas tutoriales de ese tipo

Si quieres comprender bien el uso de this deberías mirarte la parte orientada a objetos de JavaScript.
Hola, probe quitandole el "this" pero en el resultado me sale undefined. Si no es necesario el uso del this para este ejercicio, entonces como seria la manera correcta de hacerlo?
  #4 (permalink)  
Antiguo 01/05/2015, 04:45
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 7 meses
Puntos: 578
Respuesta: Duda existencial sobre el uso de "this"

Sale undefined porque:

Código Javascript:
Ver original
  1. this.radio = radio;

Deja la propiedad en el window.
  #5 (permalink)  
Antiguo 01/05/2015, 10:47
 
Fecha de Ingreso: enero-2015
Mensajes: 2
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Duda existencial sobre el uso de "this"

Mira este video, te respondera dudas sobre uso del this en Javascript https://www.youtube.com/watch?v=nRlurAqViTA
  #6 (permalink)  
Antiguo 04/05/2015, 05:08
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda existencial sobre el uso de "this"

Cita:
Iniciado por kodaichi Ver Mensaje
Hola a todos,

Estoy aprendiendo javascript y me encuentro con una duda que raya en lo existencial, no logro comprender el uso del this, sobre todo en este ejemplo:

Código HTML:
<!DOCTYPE Html>
<html>
	<head>
		<title>Ejemplo de funciones con return</title>		
		<script type="text/javascript">	
			function areaCirculo(radio){
				this.radio = radio
				return 3.1416 * (radio * radio);
			}
		</script>
	</head>
	<body>
		<script type="text/javascript">
			var radio = radio
			var resultadoAreaCirculo = areaCirculo(8);
			document.write("El area de un circulo de radio " + radio + " es " + resultadoAreaCirculo);
		</script>
	</body>
</html> 
quiero mostrar el radio que se uso para calcular el área del círculo, así que necesito recuperar ese valor que pase como parámetro a la hora de llamar a la función.
Javascript no es orientado a objetos.El keyword "this" es, como en todos los lenguajes, un ámbito donde se declaran variables y métodos, pero ese ámbito no se calcula como en lenguajes típicos orientados a objetos.
Tu ejemplo vale, con un par de modificaciones:

Código HTML:
<!DOCTYPE Html>
<html>
	<head>
		<title>Ejemplo de funciones con return</title>		
		<script type="text/javascript">	
			function areaCirculo(radio){
				this.radio = radio;
				this.area= 3.1416 * (radio * radio);
			}
		</script>
	</head>
	<body>
		<script type="text/javascript">
			var resultadoAreaCirculo = new areaCirculo(8);
			document.write("El area de un circulo de radio " + resultadoAreaCirculo.radio + " es " + resultadoAreaCirculo.area);
		</script>
	</body>
</html> 
Atento al uso de "new".
  #7 (permalink)  
Antiguo 04/05/2015, 08:52
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 7 meses
Puntos: 578
Respuesta: Duda existencial sobre el uso de "this"

Cita:
Iniciado por dashtrash
Javascript no es orientado a objetos.
Absolutamente falso.
  #8 (permalink)  
Antiguo 04/05/2015, 15:04
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda existencial sobre el uso de "this"

Cita:
Iniciado por PHPeros Ver Mensaje
Absolutamente falso.
Absolutamente verdadero
  #9 (permalink)  
Antiguo 04/05/2015, 15:27
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Respuesta: Duda existencial sobre el uso de "this"

Cita:
Iniciado por dashtrash Ver Mensaje
Absolutamente verdadero
«Sólo hay una máxima absoluta y es que no hay nada absoluto». Comte

Bueno, a mi me dijeron que este era un debate existencial.
__________________
(:
  #10 (permalink)  
Antiguo 04/05/2015, 16:18
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 1 mes
Puntos: 1329
Respuesta: Duda existencial sobre el uso de "this"

Cita:
Iniciado por dashtrash Ver Mensaje
Absolutamente verdadero
No sé en que te basas, Javascript es Orientado a Objetos aunque no usa clases per se.
__________________
Grupo Telegram Docker en Español
  #11 (permalink)  
Antiguo 04/05/2015, 16:38
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda existencial sobre el uso de "this"

Cita:
Iniciado por pzin Ver Mensaje
«Sólo hay una máxima absoluta y es que no hay nada absoluto». Comte

Bueno, a mi me dijeron que este era un debate existencial.
Lo es, para una referencia: http://stackoverflow.com/questions/1...bject-oriented
Ya sé que se puede heredar via prototipo, que se pueden crear variables cuyo comportamiento es privado,y todo tipo de cosas para que se haga algo parecido a la OOP.
Eso convierte a js en un lenguaje orientado a objetos? En mi opinion, no.En la respuesta más valorada (de largo) en el anterior link:
Cita:
So if your criteria for object orientation is the classic threesome of polymorphism, encapsulation and inheritance then Javascript doesn't pass.
Eso debería ser bastante.Si ampliamos el concepto clásico, C es orientado a objetos, y casi cualquier lenguaje es orientado a objetos.Es más, cualquier cosa que en su documentación se refiera a algo como "objeto", sería "orientado a objetos", incluso si un "objeto" javascript se parece mucho más a una struct de C++, que a un "objeto" de C++ (ojo, ni siquiera el prototipo es requerido para un objeto, ni siquiera cuando se le usa como "this")

Pero el problema no es lo que se puede hacer en js que hace que se parezca a la OOP.Es lo que se puede hacer en js , que lo permite, y que viola la OOP.Y, entre otros muchos ejemplos, la funcion "apply":
Código Javascript:
Ver original
  1. function f1(){ this.i=0;this.do=function(){this.i++;}}
  2.  
  3. var p=new f1();
  4. p.do()
  5. p.i ---> 1
  6. // Hasta aqui, todo bonito..Pero vamos a crearnos una funcion cualquiera
  7.  
  8. function myDo(){this.i*=20}
  9. // A la que podemos aplicar alegremente el objeto anterior
  10. myDo.apply(p)
  11. p.i --> 20
  12.  
  13. // Pero "this" ni siquiera tiene que apuntar a una instancia creada con new...puede ser cualquier cosa..
  14. var h={i:1}
  15. myDo.apply(h)
  16.  
  17. h--->{i:20}
Por supuesto, a la instancia se le pueden crear funciones o variables nuevas, que no comparten objetos basados en el mismo prototipo, por lo que cada "objeto" puede tener las variables miembro y las funciones que quiera.
Ni siquiera "new" supone crear un objeto relacionado de forma alguna con la funcion llamada:
Código Javascript:
Ver original
  1. function fun1(){}
  2. function fun2(v){if(v==1)return new fun1();}
  3. var t=new fun2(0);
  4. t.constructor ---> function fun2(v){if(v==1)return new fun1();}
  5. var t=new fun2(1)
  6. t instanceof fun2 ---> false !!!!
  7. t.constructor ---> function fun1(){}
(El argumento de "y por qué alguien haría eso?", no vale.Si este tipo de cosas quedaran en el tejado de "tener cuidado", aún estaríamos con variables de 2 letras máximo, ámbito sólo global, y gotos.Con tener cuidado, todo salia bien).

Son esas las características de un lenguaje pensado para programar orientado a objetos? No hay clases...no hay instancias...Hay algo llamado "object"..con eso ya es orientado a objetos?
Hombre, por qué no.Yo en mis tiempos usaba una struct en C, le asignaba punteros a funciones, y pasaba a esas funciones el puntero a la estructura, como primer parámetro.Vaya, como python.Es C orientado a objetos, entonces?

Hay que diferenciar lo que algo *es*, de lo que *puede hacer*.Con un coche puedes clavar un clavo.Eso no lo convierte en un tipo de martillo.

Última edición por dashtrash; 04/05/2015 a las 17:02
  #12 (permalink)  
Antiguo 05/05/2015, 17:46
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Duda existencial sobre el uso de "this"

http://www.crockford.com/javascript/inheritance.html

Cita:
JavaScript is a class-free, object-oriented language, and as such, it uses prototypal inheritance instead of classical inheritance. This can be puzzling to programmers trained in conventional object-oriented languages like C++ and Java. JavaScript's prototypal inheritance has more expressive power than classical inheritance, as we will see presently.
http://en.wikipedia.org/wiki/Douglas_Crockford

Cita:
Douglas Crockford is an American computer programmer and entrepreneur who is best known for his ongoing involvement in the development of the JavaScript language, for having popularized the data format JSON(JavaScript Object Notation), and for developing various JavaScript related tools such as JSLint and JSMin.[2] He is currently a senior JavaScript architect at PayPal, and is also a writer and speaker on JavaScript, JSON, and related web technologies.
No hay mas preguntas, señoría.
  #13 (permalink)  
Antiguo 07/05/2015, 08:45
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda existencial sobre el uso de "this"

Cita:
can be puzzling to programmers trained in conventional object-oriented languages
Por partes con esa frase:
1) Puzzling : Y tanto.ECMAScrript v4 es de 1999.A ver, por refrescar la memoria: PHP 4 o no habia salido, o estaba a punto de salir.Si a alguien, digamos en el año 2000/2001, le dices que JS es un lenguaje orientado a objetos, se está riendo una semana.Y tanto que puzzling.Como que se han tardado años en que se popularizara eso de los "prototipos".
Eso incluye al propio Douglas Crockford, que, si realmente se le ha leído, se ve cómo sus técnicas de creación de objetos, han ido evolucionando con el tiempo, para que, aparte de la herencia , cumpla alguno más de los requisitos de la OOP (aunque lo consiga sólo parcialmente).
De hecho, la fuente de donde la gente ha aprendido el uso de objetos en js, ha sido precisamente del trabajo de gente como Crockford.
Los documentos de Crockford son del 2001 (de 2 años después), donde describe técnicas para implementar information hiding en js.Específicamente, este documento, un must-read para cualquiera que escriba js:http://www.crockford.com/javascript/private.html.
Si se lee ese documento, hay algunas perlas:
Cita:
This pattern of public, private, and privileged members is possible because JavaScript has closures.
....
There is no book currently available on JavaScript programming that shows how to exploit it. Most don't even mention it.
Es decir, que, en aquella época, las técnicas necesarias para "simular" information hiding en JS, se basaban en características del lenguaje que casi ni se conocían.
Aún así, quizás se estaba retorciendo algo el lenguaje:
Cita:
By convention, we make a private that variable. This is used to make the object available to the private methods. This is a workaround for an error in the ECMAScript Language Specification which causes this to be set incorrectly for inner functions.
De todas formas, crockford tiene sus propias incongruencias.En este documento dice:
Cita:
This is misleading because JavaScript has more in common with functional languages like Lisp or Scheme than with C or Java. It has arrays instead of lists and objects instead of property lists
O, dicho de otra forma, en esta frase, Crockford dice que JS tiene más en común con lenguajes funcionales, que con un lenguaje orientado a objetos como Java.
Se contradice, entonces??
No
JS, como lenguaje, y como se le usaba sobre todo en esa época, era (o es) un lenguaje funcional.
Una cosa distinta es que se puedan desarrollar técnicas para hacer OOP.Igual que puedes desarrollar técnicas para hacer AOP, o igual que en C puedes desarrollar técnicas para programar casi en lo que sea.
Que existan técnicas convierte al lenguaje en un lenguaje orientado a objetos?
Java es orientado a objetos porque existen técnicas, o porque el lenguaje está diseñado para ello?
Se tardan, pongamos , 2 años desde que se diseña Java hasta que alguien empieza a implementar OOP, y unos..um..8 o 9 hasta que se populariza su uso orientado a objetos, y unos 10-11 hasta que ese uso se convierte en más o menos mainstream?
Como bien dice Crockford,
Cita:
few know that JavaScript is a very nice dynamic object-oriented general-purpose programming language. How can this be a secret? Why is this language so misunderstood?
Hay alguna posiblidad de malinterpretar y pasar por alto la OOP en Java,C++,o C#?

Y dado todo esto, se puede decir que JS es orientado a objetos, de la misma forma que Java o C++? (y eso, sin entrar en todos los temas del post anterior)
Un coche es un medio de locomoción.
Existe una técnica para clavar clavos con un coche.No muy recomendable, no la mejor forma, etc, pero poderse, se puede.

2) Si C++ es un "conventional object oriented language", js será al menos "unconventional".Si un "unconventional object oriented language" es un "object oriented language", es ya cuestión de cuánto queramos estirar la definición...
  #14 (permalink)  
Antiguo 07/05/2015, 09:00
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Duda existencial sobre el uso de "this"

Yo no vivo en el pasado. Yo vivo en el presente; por lo tanto dije Javascript ES, y no javascript ERA.

Javascript es multiparadigma. Es un lenguaje imperativo, orientado a objetos, y funcional. Cada uno programa como quiere o puede, aunque la tendencia es su vertiene POO.

Confundes la programación orientada a objetos, con la programación orientada a objetos mediante clases. Existen otras formas de programación orientada a objetos, por ejemplo por prototipado débilmente tipado, que es la que usa javascript. No sufras más, que en la versión que viene meterán POO clásico mediante clases.

Javascript cumple todos los requisitos que necesita un lenguage para poder denominarse como POO. E incluye otras caracterísitcas que son impensables en otros lenguajes POO.

Todos los tutoriales de crowford que expones son simplemente cómo usar el prototipado y las closures para emular las clases de java. Punto.

Mira qué "técnicas" proporciona javascript para crear objetos:
https://developer.mozilla.org/es/doc...lobales/Object
Yo no veo ahí ni técnicas raras, ni misterios, ni nada de lo que dices. Simplemente no son clases. Son prototipos y closures.

Última edición por marlanga; 07/05/2015 a las 09:20
  #15 (permalink)  
Antiguo 07/05/2015, 23:57
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda existencial sobre el uso de "this"

Creo que no confundo nada...el argumento de que es distinta la oop y la oop orientada a clases se supera un pelin antes del resto de argumentacion...
Donde tu vivas es indiferente para javascript.De hecho, mencionar a Crockford como argumento de autoridad, es usar lo que se decia hace 13 años...Oye, si mencionas a crockford y te sale rana porque no dices lo que crees que dice, lo siento, se arregla leyendo mejor.
Igual que el resto de las objeciones, se arreglan leyendo mejor.
Ya estan comentadas.JS no es un lenguaje pensado para oop, y si uno se emperra en eso, esta desperdiciando js.
  #16 (permalink)  
Antiguo 08/05/2015, 10:16
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Duda existencial sobre el uso de "this"

Cita:
JavaScript is a class-free, object-oriented language, and as such, it uses prototypal inheritance instead of classical inheritance. This can be puzzling to programmers trained in conventional object-oriented languages like C++ and Java. JavaScript's prototypal inheritance has more expressive power than classical inheritance, as we will see presently.
Yo creo que lo que dice crowford está bastante claro...

Pero como siempre, el mundo está equivocado menos tú, igual que en aquél hilo de MVC.

Ilústranos, y buscas urls de otros profetas que se atrevan a hacer la misma afirmación que tú, que dices que javascript NO ES un lenguaje orientado a objetos. Sorpréndeme con una autoridad que deje en pañales a crowford, el creador de JSON, o a Resig, el de jQuery.

Si es que puedes.

Última edición por marlanga; 08/05/2015 a las 10:36

Etiquetas: existencial, funcion, html, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:10.