2012-03-20 36 views
7

Rozważmy następujący kod:dlaczego tworzenie instancji wbudowanych zachowuje się inaczej?

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
} 

(new Foo()).alert(); 

Po wykonaniu (w jsfiddle), alert pokazuje, że 'to' jest obiektem okno. Zmiana ostatniej linii na:

var foo = new Foo(); 
foo.alert(); 

działa zgodnie z oczekiwaniami.

Dlaczego różnica?

+0

jsFiddle demo. Wygląda na to, że drugie "ostrzeżenie" nie zostanie wykonane: http://jsfiddle.net/sf3M3/ –

Odpowiedz

4

Wydaje się, że brakuje średnik:

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}; //Semi-colon here! 

(new Foo()).alert();​ 

Oto fiddle, w którym wydaje się działać zgodnie z oczekiwaniami.

Co się rzeczywiście dzieje jest to, że metoda alert jest wywoływana natychmiast z nową instancję Foo przeszedł do niego, a alert następnie wezwał zwracanej wartości (co jest undefined):

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 

Jak @Nemoy wspomniał, że jeśli po prostu użyjesz new Foo().alert(), otrzymasz oczekiwane zachowanie, ponieważ automatyczne wstawienie średnika spowoduje wstawienie średnika we właściwym miejscu (brak średnika nie zmienia znaczenia kod). Ponieważ operator new ma najwyższy priorytet, nawiasy nie są wymagane.

6

Twój kod jest faktycznie:

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 

powodu brakującej średnikiem, dodaj średnik i będzie działać prawidłowo.

+0

+1 Pokonaj mnie. Jest to jeden z ** wielu ** powodów, dla których nie należy polegać na horrorze, jakim jest [automatyczne wstawienie średnika] (http://es5.github.com/#x7.9). –

Powiązane problemy