Función de conversión de Javascript declarada como dictado de funciones a prototipo

Lo que estoy tratando de hacer es esto:

Mi codigo base:

var Obj = function() {
    this.do = function() {};
    this.stop = function() {};
    this.kill = function() {};
};

Obj.prototype.load = function() {};

La conversión deseada:

var ConvObject = function() { };
ConvObject.prototype = (typeof Obj == "function")? new Obj : Obj;

Este ejemplo funciona (para la parte de conversión). En ConvObject, todos los métodos de Obj están ahí. Pero en mi caso, NO quiero ejecutar el constructor predeterminado de Obj. Preferiría evitar esto. De hecho, no quiero ejecutar un nuevo Obj.

He intentado diferentes formas de lograr esto. Aquí está la mejor respuesta que pude encontrar por ahora:

var getSizeOf = function(obj) {
  var size = 0, key;
  for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
  }
  return size;
};

var ConvObject = function() { };
if ((typeof Obj == "function") && getSizeOf(Obj.prototype) == 0) {
  ConvObject.prototype = new Obj;
}
else {
  ConvObject.prototype = (typeof Obj == "function")? Obj.prototype : Obj;
}

Esto funciona cuando Obj se ve así:

var Obj = new function() {};
Obj.prototype.do = function() {};
Obj.prototype.stop = function() {};
Obj.prototype.kill = function() {};
Obj.prototype.load = function() {};

O si se ve así:

var Obj = function() {
    this.do = function() {};
    this.stop = function() {};
    this.kill = function() {};
    this.load = function() {};
};

Pero esta solución falla cuando tengo el código base anterior. ¿Cómo puedo evitar esta llamada al constructor predeterminado? ¡Gracias por la ayuda!

preguntado el 12 de junio de 12 a las 18:06

Sí, pero no quiere llamar al constructor. Dado que el código del constructor en ese caso es lo único que agrega las propiedades a los objetos, solo es posible obtenerlas llamando a la función constructora. -

Tienes más que razón. Tengo que llamar al constructor para tener estas funciones. ¡Gracias por la respuesta! -

1 Respuestas

Utiliza Object.create() (o su polyfill) para heredar directamente de Obj.prototype.

Para "heredar" métodos de instancia del Obj constructor, debe llamarlo en cada ConvObject: Herencia de Javascript muy simple. Debería hacer esto de todos modos cuando estos métodos son específicos de la instancia; de lo contrario, deberían estar en el prototipo.

contestado el 23 de mayo de 17 a las 11:05

De hecho, esta solución evita la llamada al constructor. Gracias por tu respuesta, pero Pointy me hace darme cuenta de que lo que quiero es imposible. - Jeep87c

Oh, también hay una solución para eso. Aunque, por supuesto, deberá invocar al constructor, como dijo Pointy. - Bergi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.