2010-05-20 20 views
5

Encontré esto. ¿Qué hace?¿Qué hace esto?

function G(a, b) { 
    var c = function() { }; 
    c.prototype = b.prototype; 
    a.T = b.prototype; 
    a.prototype = new c; 
} 
+1

Supongo que lo que estás preguntando es "¿por qué alguien haría esto?", Porque aparte de responder "confundir a la gente", no tengo nada para ti. – wlangstroth

+1

¿Dónde encontraste esto? La propiedad 'T' que se está configurando no es típica de ningún patrón que haya visto con respecto a la herencia prototípica. Pero lo que creo que esto podría ser es tener el constructor heredado así como la cadena de prototipos. –

Respuesta

1

Se parece al método Object.create de Crockford, pero esta función se usa para "configurar" constructores.

Acepta dos constructores como argumentos, y configura el prototype del primero.

Déjame cambiar el nombre de los nombres de las variables crípticos:

function G(sub, super) { 
    var F = function() { }; 
    F.prototype = super.prototype; 
    sub.superLink = super.prototype; 
    sub.prototype = new F(); 
} 

function Super() { 
    //... 
} 
Super.prototype.member1 = 'superMember1'; 

function Sub() { 
    this.member2 = 'subMember2'; 
} 

G(Sub, Super); 

new Sub(); // Object { member2="subMember2", member1="superMember1"} 

Editar: La propiedad T se utiliza simplemente para saber lo que es el constructor "super" de la sub, que he visto este patrón en otros lugares, como en el libro Pro JavaScript Patrones de diseño (page 43), con algunas adiciones, para evitar que la propiedad constructor para que apunte al objeto equivocado:

Consulte también:

+1

No creo que sea tan simple, la propiedad 'T' se utiliza de alguna manera no está clara por la pregunta. Además, el resultado de su respuesta se puede obtener simplemente configurando 'Sub.prototype = Super.prototype' –

+1

@Sean No exactamente. Al hacer eso, si agrega un miembro a 'Sub.prototype' también agregará un miembro a' Super.prototype'. –

+0

@CMS Creo que vale la pena señalar que 'member2' estará en la cadena prototipo de' new Sub() 'y no en' new Sub() '. –

0

parece que le da la capacidad de pasar de una función, realizar cambios en él, y luego pasar de nuevo - a.prototype es una nueva instancia copia de eso Hay ejemplos en la red que usan este tipo de código para "obtener" y "establecer".