2011-12-23 5 views
6

Considerate questo codice:L'utilizzo di new in Javascript è lo stesso di non utilizzarlo?

function klass(z) { 
    this.a = z; 
    return this; 
} 

var b = klass(5); 
var c = new klass(9);

quando l'eseguo in Chrome e il check-in della console, b risulta essere di tipo DOMWindow, mentre c è di tipo klass.

Sebbene entrambi hanno la proprietà una, efficacemente sia essendo un un'istanza di klass.

  • Si sta utilizzando o non si utilizza nuovo, lo stesso?
  • È lo stesso in questo esempio ma diverso in altre situazioni?
  • Ci sono differenze di efficienza o comportamento?
+0

Nizza domanda, vorrei sapere anche questo. –

+3

Solo dalle informazioni nella tua domanda non sono ovviamente uguali, perché gli oggetti risultanti hanno tipi diversi. Se indaga su quali altre proprietà il primo ha, vedrai la differenza ... – nnnnnn

risposta

6

Quando una funzione viene richiamata come questo

klass(6); //called function invocation 

this sarà impostato l'oggetto globale, o, se si è in modalità rigorosa, undefined

Di conseguenza, il primo esempio (senza il new) restituirà l'oggetto globale con una nuova proprietà a allegata. In modalità rigorosa genererà un errore poiché this verrà impostato su undefined e non è possibile aggiungere una proprietà a a undefined.

Quando si richiama una funzione con new

new klass(9); //called constructor invocation 

il valore this è impostato su un nuovo oggetto, ed è implicitamente tornato dalla funzione-non c'è bisogno di dire return this

Per completezza , quando invochi una funzione come metodo su un oggetto:

foo.method(); //called method invocation 

this verrà impostato sull'oggetto foo in questo caso.

E quando si richiama una funzione con applicano (o chiamare)

method.apply(foo) //called apply invocation 

this è impostato su tutto ciò che specify- foo nuovo

EDIT

ho detto nella mia risposta strict mode . Una pagina usa la modalità rigorosa se ha

"use strict" 

nella parte superiore di esso.

+0

Come ottengo la modalità rigorosa? – Thilo

+1

@Thilo - vedi modifica –

+0

+1, ma nel secondo para penso che intendessi "questo sarà impostato ..." – nnnnnn

3

non è assolutamente la stessa:

var a = klass(42); 
console.log(a.a); // 42 
var b = klass(69); 
console.log(b.a); // 69 
console.log(a.a); // 69 

Se non si chiama new, non stai ricevendo nulla di nuovo.

+1

* "Se non chiami nuovo, non ottieni nulla di nuovo." * Profondo nella sua semplicità. :) –

+0

Ma ovviamente puoi creare nuovi oggetti senza 'new' in JS. – Kos

6

Senza la new la funzione funzionerà solo su qualsiasi cosa this è stata associata a, nel tuo caso, DOMWindow. Non viene creata una nuova istanza, la proprietà a viene impostata sull'oggetto della finestra. Chiamare il metodo due volte elimina il risultato precedente.

Prova questa:

var b = klass(5) 
log.info(b.a) 
log.info(b == window) // b is actually the window object 
log.info(window.a) // also 5 

var c = klass(6) 
log.info(b.a)  // now set to 6 
log.info(c == b) // c and b are the same 
Problemi correlati