Co chwilę potwierdza się jedna teza: człowiek uczy się przez całe życie (z wyjątkiem lat szkolnych).
Przed chwilą dostałem kod który w skrócie wyglądał tak:
var obj = new function () { this.someProp = false; };
Konstrukcja jest dziwna, nawet bym powiedział bardzo, na tyle, że jhint powie nam:
Line 1: var obj = new function () {
Weird construction. Delete ‘new’.
Prawda jest taka, że jest to całkowicie poprawny kod. Jest on nawet skrótem do samo wykonującej się funkcji, który każdy z nas zna:
var obj = (function () { return { someProp: false }; })();
Prawie zaś dokładnym odpowiednikiem new function jest kod:
function ConstrObj() { this.someProp = false; } var obj = new ConstrObj;
Z tą różnicą iż nasza funkcja ConstrObj jest nie dostępna nigdzie indziej, tylko przy tym wywołaniu.
Zresztą jak popatrzymy na te wszystkie przykłady i częściowo wiemy jak działa JS, to nic dziwnego, że new function jest poprawne, skoro new ConstrObj robi to samo -> ConstrObj jest referncją do funkcji, to skoro może być referencja z nazwą to czemu nie może moglibyśmy stworzyć obiektu funkcji w tym samym miejscu po słowie kluczowym new.
Żeby było jasne:
var obj1 = function() {};
nie jest równe:
var obj2 = new function() {};
jedno przypisuje anonimową funkcję do zmiennej obj1, drugie wywołuje funkcję jako konstruktor obiektu.
Czyli:
typeof obj1 == 'function' typeof obj2 == 'object'
Dodatkowo, funkcja może zwracać wartości i obiekty. Czyli w przypadku wywołania funkcji przypisanej pod obj1, dostaniemy undefined.
W przypadku obj2, jedynie zwrócony (przez return statement) może zostać obiekt (javascript object {} lub obiekt utworzony przez new). Problem z zwracaniem obiektów z konstruktora jest taki, że nadpisze on wszystkie nasze metody/własności, które przypisaliśmy przez this.
var obj2 = new function() { // to zostanie utracone. // obj2.b === udenfided this.b = "test"; function Test() { return { // to bedzie dostepne // obj2.a === "jola" a: "jola" }; } return Test(); };
JavaScript zadziwia, i to jest fajne (choć nie zawsze) :)
typeof obj2 == 'function' – chyba literówka, ma być obj1
tak, dzieki, poprawiam
Comments are closed.