2010-05-17 11 views
6

Ho visto la presentazione di John Resig Best Practices in JavaScript Library Design; una diapositiva suggeriva di "modificare" il costruttore di oggetti in modo che si istanziasse da solo.Il wrapping è nuovo o buono all'interno del costruttore?

function jQuery(str, con) { 
    if (window === this) { 
     return new jQuery(str, con); 
    } 
    // ... 
} 

Con questo, new jQuery("#foo") diventa jQuery("#foo").

Ho pensato che fosse piuttosto interessante, ma non ho scritto un costruttore come quello nel mio codice.

Poco dopo ho letto un post qui su SO. (Scusate, non ricordo quale o fornirei un collegamento. Aggiornerò la domanda se riesco a trovarlo di nuovo.) Uno dei commenti ha detto che era una cattiva pratica nascondere new dal programmatore in quel modo, ma non entrare nei dettagli

La mia domanda è, quanto sopra generalmente considerato buono, cattivo o indifferente, e perché?

risposta

5

si tratta di una tecnica difensiva per quando la gente dimentica utilizzare l'operatore new di fronte a una funzione di 'classe'.
La logica è che se la funzione viene chiamata senza new, l'ambito globale sarà comunque l'ambito corrente (anziché le nuove istanze), quindi chiameremo la stessa funzione usando l'operatore new.

Ma se mi chiedi, la cosa corretta sarebbe quella di lanciare un errore e in realtà lasciare che lo sviluppatore sappia che ha commesso un errore invece di limitarsi ad "accettarlo".

Ma hey, credo che la sua base al mantra jQuery:
'invece di consentendo agli utenti di scrivere codice di qualità, attivare/costringerli a scrivere illogicità e codice non valido'.

1

Si sta restituendo un oggetto da una funzione. Non vedo alcun problema in questo.

è la stessa come fare:

function getObject(){ return new SomeObject; } 

L'unica differenza è che in realtà si sta da soli tornando. Ma non sembra davvero fuorviante se lo si documenta chiaramente. Le persone che sono abituate a jQuery probabilmente ti lodano per la maggiore usabilità.

4

IMO Penso che sia una tecnica di difesa valida e completamente valida.

Se si sta costruendo un constructor function, di sicuro si desidera utilizzare l'istanza di un oggetto appena creato (this), e niente di buono accadrà se this punti all'oggetto globale.

Fortunatamente, in futuro, in edizione ECMAScript 5 su rigorosa modalità, this sarà semplicemente contenere undefined quando una funzione viene richiamata senza oggetto di base né l'operatore new ...

Consulta anche:

Problemi correlati