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?
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"