Ver Mensaje Individual
  #4 (permalink)  
Antiguo 10/07/2014, 09:26
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: Herencia y constructor

Gracias a los dos! Me quedo con la versión de marlanga Pues emula mejor la herencia:
Código Javascript:
Ver original
  1. Function.prototype.extend = function (base) {
  2.     this.prototype = Object.create(base.prototype);
  3.     this.prototype.constructor = this;
  4. }
  5.  
  6. function B(){
  7.     this.b = 2;
  8.     console.log("B constructor");
  9. }
  10. B.prototype.fbb = function() { this.b++; }
  11.  
  12. function C(){
  13.     this.c = 3;
  14.     console.log("C constructor");
  15. }
  16.  
  17. C.extend(B);
  18. C.prototype.fcc = function() {  this.c++ }
  19.  
  20. var c = new C(); // C constructor : OK
  21. console.log(c instanceof B); // ok
  22. console.log(c instanceof C); // ok
  23. c.constructor(); // C constructor : ok

En la de stock me devuelve falso al comprobar si c es una instancia de B.
Código Javascript:
Ver original
  1. Function.prototype.extend = function (base) {
  2.     for( var method in base.prototype ) {
  3.         this.prototype[method] = base.prototype[method];
  4.     }
  5. }
  6.  
  7. function B(){
  8.     this.b = 2;
  9.     console.log("B constructor");
  10. }
  11. B.prototype.fbb = function() { this.b++; }
  12.  
  13. function C(){
  14.     this.c = 3;
  15.     console.log("C constructor");
  16. }
  17.  
  18. C.extend(B);
  19. C.prototype.fcc = function() {     this.c++ }
  20.  
  21. var c = new C(); // C constructor : OK
  22. console.log(c instanceof B); // false <--- no emula bien la herencia
  23. console.log(c instanceof C); // ok
  24. c.constructor(); // C constructor : ok

Y ya que estamos. He leído ya varias veces que es una mala práctica modificar el prototype de los las clases preestablecidas de Javascript (cosa que he hecho con Function en este caso). La razón que se da es que le estamos dando un comportamiento nuevo a esas clase y otro programador que use el código se podría sentir confuso ante las variaciones. Yo no soy tan radical pues entiendo que añadiendo un método que no existe previamente no se puede generar ninguna confusión. ¿Alguna objeción a este razonamiento?

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