Ver Mensaje Individual
  #11 (permalink)  
Antiguo 04/05/2015, 16:38
Avatar de dashtrash
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, 7 meses
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