Foros del Web » Programando para Internet » Javascript »

Comportamiento extraño: Require.js y herencia javascript

Estas en el tema de Comportamiento extraño: Require.js y herencia javascript en el foro de Javascript en Foros del Web. Buenas. Editado: el título habla de Require.js pero lo he obviado y he simplificado el código, pues el problema es inherente al uso de Require.js ...
  #1 (permalink)  
Antiguo 11/06/2014, 04:12
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Comportamiento extraño: Require.js y herencia javascript

Buenas.

Editado: el título habla de Require.js pero lo he obviado y he simplificado el código, pues el problema es inherente al uso de Require.js

El problema está con dos clases TableX y OutputX que heredan de NodeX. Este es el código:
Código Javascript:
Ver original
  1. function NodeX(){};
  2.  
  3.     function OutputX(){}
  4.  
  5.     OutputX.prototype = NodeX.prototype;
  6.     OutputX.prototype.foo = function(){
  7.         console.log("OutputX.prototype.foo");
  8.     }
  9.  
  10.     function TableX(){};
  11.  
  12.     TableX.prototype = NodeX.prototype;
  13.  
  14.     TableX.prototype.foo = function(){
  15.         console.log("TableX.prototype.foo");
  16.     }
  17.     TableX.prototype.bar = function(){
  18.         console.log("TableX.prototype.bar");
  19.     }
  20.  
  21.     var o = new OutputX;
  22.     o.foo();
  23.     o.bar();

En principio como OutputX no extiende a la clase TableX, o.foo() no debería devolver "TableX.prototype.foo" por consola y o.bar() debería dar un error. Sin embargo no es este el caso.

¿Que se me está escapando para no entender este comportamiento, a mi ver, tan extraño?

Un saludo y gracias!
__________________
github.com/xgbuils | npm/xgbuils

Última edición por Pantaláimon; 11/06/2014 a las 04:56
  #2 (permalink)  
Antiguo 11/06/2014, 05:49
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Comportamiento extraño: Require.js y herencia javascript

Código Javascript:
Ver original
  1. OutputX.prototype = NodeX.prototype;
  2. TableX.prototype = NodeX.prototype;
Esto no sirve para heredar. Estás igualando prototipos, has hecho que los tres "objetos" tengan el mismo prototipado. El comportamiento es raro, pero es fácil de evitar.

Cambialos por la mejor forma de heredar que he visto de momento:
Código Javascript:
Ver original
  1. OutputX.prototype = Object.create(NodeX.prototype);
  2. TableX.prototype = Object.create(NodeX.prototype);

Ejemplo completo:
Código Javascript:
Ver original
  1. function NodeX(){};
  2. NodeX.prototype.bla = function(){
  3.     console.log("NodeX.prototype.bla");
  4. }
  5.  
  6. function OutputX(){}
  7.  
  8. OutputX.prototype = Object.create(NodeX.prototype);
  9.  
  10. OutputX.prototype.foo = function(){
  11.     console.log("OutputX.prototype.foo");
  12. }
  13.  
  14. function TableX(){};
  15.  
  16. TableX.prototype = Object.create(NodeX.prototype);
  17.  
  18. TableX.prototype.foo = function(){
  19.     console.log("TableX.prototype.foo");
  20. }
  21. TableX.prototype.bar = function(){
  22.     console.log("TableX.prototype.bar");
  23. }
  24.  
  25. var o = new OutputX;
  26. o.foo();
  27. o.bla();
  28. o.bar();
  #3 (permalink)  
Antiguo 11/06/2014, 07:43
Avatar de jp91  
Fecha de Ingreso: mayo-2014
Mensajes: 94
Antigüedad: 10 años, 6 meses
Puntos: 11
Respuesta: Comportamiento extraño: Require.js y herencia javascript

Asi como esta el codigo de arriba pues arrojaria un error ya que uno de esos metodos no existe en la funcion y si vas a usar este metodo deberias tener cuidado ya que se puede perder la referencia al constructor que esperarias que apunte.
__________________
OOoo Como hacer ooOO
juegos con Html5.
  #4 (permalink)  
Antiguo 12/06/2014, 10:45
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: Comportamiento extraño: Require.js y herencia javascript

Gracias marlanga.

Estaba obcecado en que se heredaba por ese sistema.

Por cierto, en algun lugar he mirado que también explican la herencia así:
Código Javascript:
Ver original
  1. TableX.prototype = new NodeX;

Pero veo que no son equivalentes:
Código Javascript:
Ver original
  1. function Base( x ){
  2.     this.a = x;
  3. };
  4.  
  5. function A(){};
  6. function B(){};
  7.  
  8. A.prototype = new Base;
  9. B.prototype = Object.create( Base.prototype );
  10.  
  11. console.log( A.prototype );
  12. console.log( B.prototype );

Me quedo con Object.create

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #5 (permalink)  
Antiguo 12/06/2014, 15:22
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Comportamiento extraño: Require.js y herencia javascript

Ésa es la forma que yo usaba antes de conocer los métodos del objeto Object, que se pueden usar para simular la programación orientada a objetos mediante clases de otros lenguajes, pero tiene un defecto: Cuando la función que haga de Clase base acepte argumentos, tirará una advertencia "invisible" que los navegadores ignoran.
O peor aún, si haces algún tratamiento "avanzado" de esos argumentos (por ejemplo, uno de los argumentos esperas que sea una instancia de un objeto tuyo determinado, al que le ejecutas algún método) entonces dará error porque en esa llamada no le mandas nada.

Aunque creo recordar de haber leído por haí que el futuro EcmaScript 6 ya trae orientación a objetos mediante clases, muy parecida ala sintaxis de java, con lo que al final se crearán crearán clases con métodos y atributos públicos y privados sin romperse uno la cabeza como ahora (donde hay tropecientos mil formas distintas de implementar clases).
  #6 (permalink)  
Antiguo 13/06/2014, 03:41
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: Comportamiento extraño: Require.js y herencia javascript

Cita:
O peor aún, si haces algún tratamiento "avanzado" de esos argumentos (por ejemplo, uno de los argumentos esperas que sea una instancia de un objeto tuyo determinado, al que le ejecutas algún método) entonces dará error porque en esa llamada no le mandas nada.
Exacto, en ese caso habría que preocuparse de implementar el constructor para los casos en que los parámetros pasados sean undefined. Y habiendo Object.create, para qué preocuparse de eso!

Edit: Ah! que con los métodos de Object también ocurre? Vaya pues...
__________________
github.com/xgbuils | npm/xgbuils
  #7 (permalink)  
Antiguo 13/06/2014, 03:53
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Comportamiento extraño: Require.js y herencia javascript

¿El qué ocurre?

Código Javascript:
Ver original
  1. function A(arr){
  2.     this.arr=arr;
  3.     this.arr.push("d");
  4. }
  5.  
  6. A.prototype.getArr=function(){ return this.arr; };
  7.  
  8. function B(){
  9.     A.call(this, ["a","b","c"]); //Llamada al constructor padre
  10. };
  11.  
  12. function C(){
  13.     A.call(this, ["a","b","c"]); //Llamada al constructor padre
  14. };
  15.  
  16. B.prototype=Object.create(A.prototype);
  17. var b=new B();
  18. console.log(b.getArr());
  19.  
  20. C.prototype=new A;
  21. var c=new C();
  22. console.log(c.getArr());

B funciona bien, C tira error por ejecutar un push sobre un argumento "undefined" en la llamada de la línea 20.
No olvidar que aunque buscamos que B y C hereden todo de A, al constructor del padre hay que llamarlo explícitamente (porque en realidad no hay herencia, la estamos simulando).
  #8 (permalink)  
Antiguo 14/06/2014, 04:29
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: Comportamiento extraño: Require.js y herencia javascript

Cita:
los métodos del objeto Object, que se pueden usar para simular la programación orientada a objetos mediante clases de otros lenguajes, pero tiene un defecto: Cuando la función que haga de Clase base acepte argumentos, tirará una advertencia "invisible" que los navegadores ignoran.
Entendí que con los métodos de Object también ocurre que tira la advertencia. Pero claro, ahora entiendo que mejor que sea una advertencia invisible a otra que no.

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils

Etiquetas: comportamiento, extraño, herencia, html, js
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 18:37.