2010-05-20 25 views
5

Ho trovato questo. Che cosa fa?Cosa fa?

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

Credo che quello che stai chiedendo è "il motivo per cui qualcuno dovrebbe fare questo?", Perché altro che rispondere "per confondere la gente", non ho niente per te. – wlangstroth

+1

Dove l'hai trovato? La proprietà 'T' impostata non è tipica di alcun modello che ho visto per quanto riguarda l'ereditarietà prototipale. Ma quello che credo potrebbe essere il possesso del costruttore e la catena del prototipo. –

risposta

1

Sembra simile al metodo Object.create di Crockford, ma questa funzione viene utilizzata per "configurare" i costruttori.

accetta due costruttori come argomenti, e messe a punto l'prototype del primo.

Permettetemi di rinominare i nomi delle variabili criptici:

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"} 

Edit: La proprietà T è utilizzata semplicemente per sapere che cosa è il costruttore "super" del sub uno, Ho visto questo modello su altri luoghi, come nel libro Pro Patterns JavaScript design (page 43), con alcune aggiunte, per evitare che la proprietà constructor per puntare l'oggetto sbagliato:

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
     superClass.prototype.constructor = superClass; 
    } 
} 

Consulta anche:

+1

Non penso che sia così semplice, la proprietà 'T' è usata in qualche modo non chiara dalla domanda. Inoltre, il risultato della tua risposta può essere raggiunto semplicemente impostando 'Sub.prototype = Super.prototype' –

+1

@Sean Non del tutto. Facendo ciò, se si aggiunge un membro a 'Sub.prototype', si aggiungerà anche un membro a' Super.prototype'. –

+0

@CMS Penso che valga la pena notare che 'member2' sarà nella catena di prototipi di' new Sub() 'e non su' new Sub() 'stesso. –

0

sembra che ti dà la possibilità di passare in una funzione, apportare modifiche ad esso, e poi passare di nuovo - a.prototype è una nuova istanziato copia di esso. Ci sono esempi in rete che utilizzano questo tipo di codice per "ottenere" e "impostare".