Cita:
Iniciado por pzin «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 originalfunction f1(){ this.i=0;this.do=function(){this.i++;}}
var p=new f1();
p.do()
p.i ---> 1
// Hasta aqui, todo bonito..Pero vamos a crearnos una funcion cualquiera
function myDo(){this.i*=20}
// A la que podemos aplicar alegremente el objeto anterior
myDo.apply(p)
p.i --> 20
// Pero "this" ni siquiera tiene que apuntar a una instancia creada con new...puede ser cualquier cosa..
var h={i:1}
myDo.apply(h)
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 originalfunction fun1(){}
function fun2(v){if(v==1)return new fun1();}
var t=new fun2(0);
t.constructor ---> function fun2(v){if(v==1)return new fun1();}
var t=new fun2(1)
t instanceof fun2 ---> false !!!!
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.