2011-12-23 16 views
6

Rozważmy następujący kod:Czy używasz nowego w JavaScript, tak samo jak go nie używasz?

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

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

Kiedy uruchamiam go w Chrome i sprawdzić w konsoli b okazuje się być typu DOMWindow, natomiast c jest typu klass.

Chociaż oba mają własności A, skutecznie zarówno będąc przykład z Klaß.

  • Czy używasz lub nie używasz nowego, tego samego?
  • Czy to samo dotyczy tego przykładu, ale różni się w innych sytuacjach?
  • Czy występują różnice w wydajności lub zachowaniu?
+0

Nicea pytanie, chciałbym wiedzieć, to też. –

+3

Z informacji znajdujących się w pytaniu wynika, że ​​nie są one takie same, ponieważ powstałe obiekty mają różne typy. Jeśli sprawdzisz, jakie właściwości_pozostałe_, pierwsza z nich zauważysz różnicę ... – nnnnnn

Odpowiedz

6

Gdy funkcja jest wywoływana jak ten

klass(6); //called function invocation 

this zostanie ustawiony do globalnego obiektu, lub, jeśli jesteś w trybie ścisłym, undefined

W rezultacie pierwszy przykład (bez new) zwróci obiekt globalny z dołączoną nową właściwością a. W trybie ścisłym zostanie zgłoszony błąd, ponieważ this zostanie ustawiony na undefined, a nie można dodać właściwości a do undefined.

Po wywołaniu funkcji z new

new klass(9); //called constructor invocation 

wartość this jest ustawiony do nowego obiektu i jest niejawnie powrócił z funkcji, nie ma potrzeby, aby powiedzieć return this

kompletności , gdy wywołujesz funkcję jako metodę dla obiektu:

foo.method(); //called method invocation 

this zostanie w tym przypadku ustawiony na obiekt - foo.

A kiedy wywołanie funkcji z zastosowania (lub zadzwoń)

method.apply(foo) //called apply invocation 

this jest ustawiony na cokolwiek specify- foo ponownie

EDIT

wspominałem strict mode w mojej odpowiedzi . Strona korzysta z trybu ścisłego, jeśli na samej górze znajduje się

"use strict" 
.

+0

Jak uzyskać tryb ścisły? – Thilo

+1

@Thilo - patrz edytuj –

+0

+1, ale w twoim drugim akapicie myślę, że miałeś na myśli "to" zostanie ustawione ... " – nnnnnn

3

To nie jest absolutnie takie same:

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

Jeśli nie zadzwonić new, nie dostajesz nic nowego.

+1

* "Jeśli nie zadzwonisz nowy, nie dostaniesz nic nowego." * Głęboko w swojej prostocie. :) –

+0

Ale oczywiście możesz tworzyć nowe obiekty bez 'nowego' w JS. – Kos

6

Bez funkcji Twoja funkcja będzie działać tylko na tym, co jest związane z this, w twoim przypadku DOMWindow. Żadne nowe wystąpienie nie zostanie utworzone, właściwość a zostanie ustawiona na obiekcie okna. Wywołanie metody dwukrotnie dłubie poprzedni wynik.

Spróbuj tego:

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 
Powiązane problemy