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) :)

2 KOMENTARZE

Comments are closed.