2011-11-20 10 views
13

Ho visto un video in cui Crockford ci ha detto di non utilizzare la parola chiave new. Ha detto di usare Object.create invece se non sbaglio. Perché ci ha detto di non usare new se ha usato nel raggiungimento di ereditarietà prototipale in questo articolo che ha scritto: http://javascript.crockford.com/prototypal.htmlPerché Crockford dice di non usare la nuova parola chiave se ci consiglia di usarla per l'ereditarietà prototipale?

mi aspetterei che lui usi Object.create invece di new, in questo modo:

function object(o) { 
    return Object.create((function() {}).prototype = o); 
} 

Quindi perché usa ancora new?

+1

Forse ha imparato qualcosa da quel video/articolo? È difficile sapere senza il video/contesto. – alexn

+2

Probabilmente una combinazione di A) 'Object.create' non è [supportata] (http://kangax.github.com/es5-compat-table/) su una manciata di browser, e B) che l'articolo è stato scritto diversi anni fa; il suo stile di programmazione, come la maggior parte dei nostri, probabilmente è cambiato e si è evoluto da allora. –

+0

Ecco il video: http://www.youtube.com/watch?v=hQVTIJBZook (non so esattamente dove nel video ha detto che, scusa) – 0x499602D2

risposta

6

Crockford discute new e Object.create in this Nov 2008 message to the JSLint.com mailing list. Un estratto:

Se si chiama una funzione di costruzione senza il prefisso new, invece di creare e inizializzare un nuovo oggetto, verrà danneggiando l'oggetto globale . Non ci sono avvisi di tempo di compilazione e nessun avviso di runtime . Questa è una delle parti peggiori della lingua.

Nella mia pratica, evito completamente l'uso di new.

+0

Forse non ho familiarità con tutti gli hack di javascript, ma perché qualcuno dovrebbe chiamare una funzione di costruzione senza la parola chiave 'new'?!? – xmashallax

+0

Quello che Crockford * effettivamente * dice è che se omettete * la nuova parola chiave coccherete l'oggetto globale.È il rischio di ometterlo, motivo per cui raccomanda di non usarlo. È richiesto per gli oggetti costruttore. – K3N

5

Questa è una domanda veramente vecchio, ma ...

Quando Crockford ha scritto the article you mention e the discussion linked by Paul Beusterien, non c'era Object.create. Era il 2008 e Object.create era, al massimo, una proposta (o molto raramente implementata nei browser).

sua formulazione finale è fondamentalmente un polyfill:

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 

newObject = Object.create(oldObject); 

suo unico utilizzo di new è, pertanto, per simulare (o emulare) cosa Object.create deve fare.

Non ci consiglia di usarlo. Presenta un polyfill che lo usa, quindi non devi usarlo da nessun'altra parte.

Problemi correlati