Javascript extiende el prototipo del objeto pero mantiene el prototipo antiguo

Necesito extender el prototipo de un objeto sin eliminar su prototipo actual

var obj = (function() {
    function Obj(){

    }

    Obj.prototype.func1 = function() {}

    extend = {
        func2: function(){}
    }

    Obj.prototype = extend;

    return Obj;
}());

¿Cómo hago esto y mantengo func1?

preguntado el 03 de diciembre de 13 a las 13:12

3 Respuestas

Es tan simple como usar un bucle for-in para copiar propiedades de su existente extend objeto en Obj.prototype:

for (var key in extend)
    // make sure it's actually a direct property of extend
    if (extend.hasOwnProperty(key))
        // copy over value from extend into prototype
        Obj.prototype[key] = extend[key];

Respondido el 03 de diciembre de 13 a las 13:12

Obj.prototype.func2 = function() {}

... Simplemente siga agregando métodos al prototipo existente.

Respondido el 03 de diciembre de 13 a las 13:12

Pero eso es lo que quiero evitar - php_nub_qq

@php_nub_qq ¿por qué? ¿Cuál es el problema que quieres evitar? ¿Qué tiene de malo agregar más funciones al objeto prototipo? - Puntiagudo

@php_nub_qq Su publicación decía "Necesito extender el prototipo de un objeto sin eliminar su prototipo actual". Eso es lo que hace... Agrega un método al prototipo sin eliminar el prototipo actual ni nada en él. - hablando

porque sigo repitiendo Obj.prototype y mis funciones pueden llegar a ser un gran número, eso es solo pérdida de espacio. Sé que puedo poner todas las funciones en un objeto y luego asignarlo al prototipo, pero la pregunta es más sobre el principio, ¿por qué no puedo extender el objeto como en php manteniendo todos los métodos no sobrescritos? - php_nub_qq

Su pregunta fue un poco confusa. Puedes, mira las otras respuestas. JavaScript usa herencia de prototipo, no herencia clásica, por lo que no es fácil compararlo con lenguajes que usan herencia clásica. JavaScript tiene delegación de comportamiento que es lo que permite el prototipo del sistema. De hecho, es muy poderoso y te permite hacer algunas cosas OO realmente agradables sin intentar emular clases. - hablando

Si desea "importar" propiedades de otro objeto, puede crear una función "extender":

function extend(o1, o2) {
  for (var key in o2)
    if (o2.hasOwnProperty(key))
      o1[key] = o2[key];
  return o1;
}

Entonces:

  extend(Obj.prototype, extend);

Respondido el 03 de diciembre de 13 a las 13:12

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