2012-07-15 12 views
12

Stavo giocando con JavaScript, in particolare simulando la programmazione orientata agli oggetti con le classi e quant'altro.Copia il prototipo per ereditarietà?

ho saputo di questo modo di raggiungere l'eredità

MyClass.prototype = new AnotherClass(); 

ma non ero soddisfatto, non mi piace come ho avuto bisogno di chiamare il costruttore di AnotherClass. Quindi stavo giocando e mi è venuto in mente qualcosa che sembrava funzionare e fondamentalmente volevo una seconda opinione.

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

    return new CloneFactory(); 
} 

MyClass.prototype = clone(AnotherClass.prototype); 

Clonando il prototipo otteniamo una nuova copia di esso e assegnare tale da prototipo MyClass s' in modo che la modifica delle proprietà ereditate non influenzerà le proprietà del prototipo del genitore. In questo modo sarebbe MyClass.prototype = AnotherClass.prototype.

Ho eseguito test di stress e questo è più efficiente in determinate circostanze, vale a dire quando c'è molto codice nel costruttore del genitore, altrimenti è più o meno lo stesso. Un altro vantaggio (o almeno lo trovo utile) è che consente in una certa misura di nascondere le informazioni dalle sottoclassi. Qualsiasi metodo e membro privilegiato NON sarà ereditato.

C'è qualche grave trappola che sto trascurando?

Non sono un esperto di JavaScript, in realtà sono abbastanza nuovo su JavaScript, quindi mi piacerebbe avere un secondo parere su questo perché non riesco a trovare nulla attraverso Google. Non voglio implementare codice errato :)!

risposta

17

Questo è quasi esattamente ciò che fa Object.create. La funzione che hai scritto è un "polyfill" piuttosto standard per quel metodo.

Questo è un modo veramente comune di astrarre la creazione dell'oggetto in modo da riflettere più da vicino l'eredità prototipale "vera". Sicuramente un modo sicuro per fare le cose.

Oh, ed ecco un link alla voce MDN per Object.create, se siete interessati: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

Noterete in basso che in realtà sono la polyfill, che è praticamente identico al codice , salvo per alcuni controlli di sicurezza e nomi di variabili.

+0

Grazie! Fino ad ora non sapevo nemmeno di "Object.create". – SpaceFace

Problemi correlati