2012-05-11 26 views
23

Poniższy kod JavaScript jest bardzo mylący. Czy ktokolwiek mógłby mi pomóc zrozumieć. Dlaczego PersonY nie ma własności prototypowej.Różnica w JavaScript między funkcją a nową funkcją

PersonX = function(){}; 
PersonY = new function(){}; 
alert(PersonX.prototype); 
alert(PersonY.prototype);  
​ 
+0

Użyj 'function', a nie' nowej funkcji'. –

+0

Po prostu nigdy nie używaj drugiego konstruktora] (http://stackoverflow.com/q/10406552/1048572). – Bergi

Odpowiedz

33
PersonX = function(){}; 

Miejsca odniesienie do anonimowej funkcji w PersonX. PersonX wskazuje na funkcję.

PersonY = new function(){}; 

Umieszcza odniesienia do nowo skonstruowaną przykład anonimowego funkcji konstruktora do PersonY. PersonY wskazuje na obiekt.


Jeśli chodzi o prototyp, to ma on numer PersonY. Jednakże, ponieważ nie było żadnych właściwości i metod dołączonych do konstruktora before ani instancji after, ma on pusty prototyp *.

Można faktycznie sprawdzić prototyp PersonY, wykonując console.log(PersonY). Zobaczysz, że ma on prototypową właściwość (widzę ją jako __proto__ w Chrome), która jest "pusta". Ale ma dwie ukryte właściwości, constructor, która jest funkcją konstruktora, która stworzyła obiekt, i inną __proto__, która prowadzi cię do następnego "ogniwa łańcucha", który byłby obiektem Object.

* Niezupełnie puste, ponieważ prototyp to łańcuch. Ten poziom prototypu może być pusty, ale następny wyższy prototyp może mieć, lub w tym przypadku, właściwości i metody.

Object prototype -> Constructor prototype -> Your Instance will have: 
- toString()  - blank     - toString() 
- hasOwnProperty()       - hasOwnProperty() 
- and more...        - and more... 
              - ...but nothing from Constructor 
+0

Tak. 'typeof new function() {} =>" object "' –

+0

Dzięki, @Joseph odpowiedzi i komentarze były naprawdę pomocne. – riship89

+0

który lub dwa sintaxy są lepsze dla wydajności? – rkmax

0

To dlatego, że w rzeczywistości jest to instancja obiektu w pamięci jako kopia funkcji; prototyp ma znaczenie tylko w kontekście tworzenia instancji, więc gdy zostanie utworzony, nie ma logicznej konstrukcji tego, co to oznacza.

Powiązane problemy