Przejdź do treści

Funkcja to czy obiekt, któż to wie?

W dużym projekcie występuje często spotykany problem. Mianowicie, gdy funkcję traktujemy jako konstruktor obiektu, a nie powinniśmy i przed wywołaniem funkcji dopisaliśmy operator new.

Co wtedy? Jak zachowa się aplikacja? Jak to sprawdzić? Jak zapobiec?

Baner promujący artykuł

Jeżeli pattern użyty w aplikacji korzysta z kontekstu to sytuacja może się skomplikować. Ciało funkcji, w którym jest odniesienie się do aktualnego kontekstu będzie różny w zależności w jaki sposób skorzystamy z definicji funkcji.

Jeśli wywołamy funkcję w globalnym scope'ie to this odnosi się do obiektu globalnego Window. Jeśli jednak przez pomyłkę, bądź specjalnie użyjemy przed wywołaniem funkcji operatora new to this będzie referencją do obiektu, który właśnie powstał.

Przykład cross-platform-owej implementacji:

function test() {
    if (arguments.callee.prototype.constructor === this.constructor) {
        console.log("obiekt");
    } else {
        console.log("funkcja");
    }
}

test(); // Print: "funkcja"
new test(); // Print: "obiekt"