Zapis w języku JavaScript
var napis1 = new napisy();ma za zadanie
A. zadeklarowanie zmiennej napis1 i wywołanie funkcji, której argumentem jest napis1.
B. utworzenie nowej klasy napis1.
C. utworzenie obiektu napis1 klasy napisy.
D. wywołanie metody obiektu napisy.
Pytanie z egzaminu CKE, czerwiec 2016 (arkusz E.14-X-16.05).
Zapis var napis1 = new napisy(); oznacza utworzenie nowego obiektu i przypisanie go do zmiennej napis1. Słowo kluczowe new w JavaScript uruchamia funkcję konstruktora albo klasę, w tym przypadku napisy, i tworzy jej instancję. W praktyce wygląda to tak, że JavaScript przygotowuje nowy obiekt, ustawia mu odpowiedni prototyp, wywołuje konstruktor z this wskazującym na ten nowy obiekt, a wynik przypisuje do zmiennej napis1. Czyli napis1 jest obiektem klasy lub konstruktora napisy. Moim zdaniem warto tu od razu zapamiętać dobrą praktykę: konstruktory i klasy w JavaScript zwykle zapisuje się wielką literą, np. Napisy, bo wtedy od razu widać, że używamy new Napisy(). Sam zapis z var jest poprawny, ale we współczesnym kodzie częściej spotkasz let albo const, zgodnie z aktualnymi praktykami ECMAScript. Przykład praktyczny: const auto = new Samochod(); tworzy konkretny obiekt auto na podstawie szablonu Samochod. Tak samo tutaj napis1 jest konkretną instancją typu napisy, a nie nową klasą ani zwykłym wywołaniem metody.
W tym zapisie łatwo pomylić kilka podobnych pojęć z JavaScriptu, szczególnie gdy dopiero zaczyna się programowanie obiektowe. Fragment var napis1 = new napisy(); nie jest wywołaniem metody obiektu. Metoda zwykle jest wywoływana na konkretnym obiekcie przez kropkę, na przykład obiekt.metoda(), albo przez nawiasy kwadratowe. Tutaj mamy słowo new, więc chodzi o konstruktor, czyli mechanizm tworzenia nowej instancji. Samo napisy() bez new mogłoby być zwykłym wywołaniem funkcji, ale new napisy() zmienia sens operacji: JavaScript tworzy nowy obiekt i przekazuje go do konstruktora jako this. Nie jest to też deklaracja zmiennej i wywołanie funkcji z argumentem napis1, bo w nawiasach po napisy nie ma żadnego argumentu. Gdyby napis1 miał być argumentem funkcji, zapis wyglądałby raczej tak: funkcja(napis1). Tutaj kierunek jest odwrotny: wynik działania konstruktora trafia do zmiennej napis1. Błędem jest również myślenie, że powstaje nowa klasa o nazwie napis1. Klasy definiuje się inną składnią, np. class Napis {}, a nie przez przypisanie z operatorem new. Z mojego doświadczenia takie pomyłki biorą się z tego, że słowa klasa, obiekt, konstruktor i metoda brzmią podobnie, ale w kodzie mają bardzo konkretne role. Warto też pamiętać, że jeśli napisy nie byłoby wcześniej zdefiniowane jako konstruktor albo klasa, taki kod zakończyłby się błędem wykonania, a nie magicznym utworzeniem czegoś od zera.