2012-07-15 18 views
12

Estaba jugando con JavaScript en particular simulando la programación orientada a objetos con clases y otras cosas.Copiar prototipo de herencia?

que sabía de esta manera de alcanzar la herencia

MyClass.prototype = new AnotherClass(); 

pero no estaba satisfecho, no me gusta la forma en que tenía que llamar al constructor de AnotherClass. Así que estaba jugando y se me ocurrió algo que parecía funcionar y básicamente quería una segunda opinión.

function clone (obj) 
{ 
    function CloneFactory() {} 
    CloneFactory.prototype = obj; 

    return new CloneFactory(); 
} 

MyClass.prototype = clone(AnotherClass.prototype); 

clonando el prototipo que obtener una nueva copia del mismo y asignar a ese prototipo MyClass 's de modo que el cambio de las propiedades heredadas no afectará a las propiedades del prototipo de los padres. Me gusta esto sería MyClass.prototype = AnotherClass.prototype.

Realicé pruebas de resistencia y esto es más eficiente bajo ciertas circunstancias, es decir, cuando hay mucho código en el constructor del padre, de lo contrario es casi lo mismo. Otro beneficio (o al menos creo que es beneficioso) es que permite en cierta medida ocultar información de las subclases. Los métodos y miembros privilegiados NO se heredarán.

¿Hay alguna falla importante que estoy pasando por alto?

No soy un experto con JavaScript, en realidad soy bastante nuevo en JavaScript, por lo que me gustaría tener una segunda opinión sobre esto porque parece que no puedo encontrar nada a través de Google. No quiero implementar un código malo :)!

Respuesta

17

Esto es casi exactamente lo que Object.create hace. La función que ha escrito es un "polyfill" bastante estándar para ese método.

Esta es una forma muy común de abstraer la creación de objetos de una manera que refleja más fielmente la herencia de prototipos "verdadera". Definitivamente una forma segura de hacer las cosas.

Ah, y aquí hay un enlace a la entrada MDN para Object.create, si está interesado: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

Se dará cuenta en la parte inferior que en realidad incluyen la polyfill, que es prácticamente idéntica a su código , excepto algunas verificaciones de seguridad y nombres de variables.

+0

Gracias! Ni siquiera sabía acerca de 'Object.create' hasta ahora. – SpaceFace