Należy tutaj zauważyć, że skoro Javascript jest językiem dynamicznym , każdy obiekt jest w zasadzie tylko uwielbioną mapą skrótu ( z kilkoma wyjątkami ). Do wszystkiego w obiekcie JavaScript można uzyskać dostęp na dwa sposoby - notację w nawiasach i notację kropkową.
Szybko przejrzę dwa zapisy odpowiadające na pierwszą część twojego pytania, a następnie przejdę do drugiej części.
Notacja w nawiasie
Ten tryb jest bardziej podobny do uzyskiwania skrótów i tablic w innych językach programowania. Możesz uzyskać dostęp do dowolnego komponentu (danych (w tym innych obiektów) lub funkcji) przy użyciu tej składni.
Właśnie to robisz w swoim przykładzie. Masz 'a'
, który jest ciągiem (a nie dosłownym znakiem, tak jak w języku takim jak C ++).
Za pomocą notacji nawiasowej uzyskuje się dostęp do jej toUpperCase
metody. Ale dostęp do niego wciąż nie wystarczy; po prostu wpisanie alert
, na przykład w JavaScript, nie wywołuje tej metody. To tylko proste stwierdzenie. Aby wywołać funkcję, musisz dodać nawias: alert()
pokazuje proste okno dialogowe zawierające undefined
, ponieważ nie otrzymał żadnych parametrów. Możemy teraz wykorzystać tę wiedzę do odszyfrowania twojego kodu, który staje się:
alert('a'.toUpperCase());
Co jest znacznie bardziej czytelne.
Właściwie dobrym sposobem na zrozumienie tego nieco lepiej jest uruchomienie następującego Javascript:
alert(alert)
Wymaga to alert
przekazując mu obiekt funkcji, również alert
bez również wykonanie drugiego wpisu. Pokazane (przynajmniej w Chrome 26) są następujące:
function alert() { [native code] }
Powołanie:
alert(alert())
pokazuje dwa kolejne pola wiadomości zawierające undefined
. Łatwo to wytłumaczyć: alert()
najpierw wykonywane jest wnętrze , pokazuje undefined
(ponieważ nie ma żadnych parametrów) i nic nie zwraca. Alarm zewnętrzny otrzymuje wartość zwracaną przez alert wewnętrzny - który jest niczym, a także pojawia się undefined
w oknie komunikatu.
Wypróbuj wszystkie skrzynki na jsFiddle!
Notacja kropkowa
Jest to bardziej standardowe podejście, które umożliwia dostęp do elementów obiektu za pomocą .
operatora kropki ( ). Oto jak wyglądałby Twój kod w notacji kropkowej:
alert('a'.toUpperCase())
O wiele bardziej czytelny. Kiedy więc powinniśmy używać notacji kropkowej, a kiedy notacji nawiasowej?
Porównanie
Główna różnica między tymi dwiema metodami jest semantyczna. Są też inne szczegóły, ale zajmę się nimi za chwilę. Najważniejsze jest to, co naprawdę chcesz zrobić - ogólna zasada polega na tym, że używasz notacji kropkowej dla dobrze ustalonych pól i metod, jakie posiada obiekt, oraz notacji nawiasowej, gdy faktycznie używasz swojego obiektu jako mapy hash .
Świetny przykład, dlaczego ta reguła jest tak ważna, można pokazać na przykładzie - ponieważ kod używa notacji nawiasowej w miejscu, w którym notacja kropkowa byłaby znacznie bardziej sensowna, utrudnia to odczytanie kodu. A to zła rzecz, ponieważ kod jest odczytywany wiele razy więcej niż jest napisany .
W niektórych przypadkach musisz użyć notacji nawiasowej, nawet jeśli bardziej sensowne jest użycie notacji kropkowej :
jeśli członek obiektu ma nazwę zawierającą co najmniej jedną spację lub dowolne inne znaki specjalne, nie można użyć notacji kropkowej: foo.some method()
nie działa, ale foo["some method"]()
działa;
jeśli potrzebujesz dynamicznie uzyskać dostęp do elementów obiektu, utkniesz także przy użyciu notacji nawiasowej;
Przykład:
for(var i = 0; i < 10; ++i) {
foo["method" + i]();
}
Najważniejsze jest to, że powinieneś używać składni nawiasów, gdy używasz obiektu jako mapy skrótów ( foods["burger"].eat()
), a składni kropek, gdy pracujesz z „rzeczywistymi” polami i metodami ( enemy.kill()
). Ponieważ Javascript jest językiem dynamicznym, granica między „rzeczywistymi” polami i metodami obiektu a „innymi” przechowywanymi danymi może być dość rozmyta. Ale dopóki nie pomieszacie ich w mylący sposób, wszystko powinno być w porządku.
Teraz na resztę pytania (wreszcie!: P).
jak mogę być pewien, że metoda zawsze będzie członkiem obj
Nie możesz Spróbuj. Spróbuj wywołać derp
ciąg. Pojawi się błąd w wierszach:
Uncaught TypeError: Object a has no method 'derp'
Jest to rodzajowa funkcja wywoływania DOWOLNYCH metod na DOWOLNYM obiekcie. Ale czy to oznacza, że określona metoda będzie już niejawnym członkiem określonego obiektu?
Tak, w twoim przypadku musiałoby tak być. W przeciwnym razie kończy się błąd, o którym wspomniałem powyżej. Jednak nie mają do wykorzystania return obj[method]();
w callMethod()
funkcji. Możesz dodać własną funkcjonalność, która następnie zostanie użyta przez funkcję mapy. Oto zakodowana metoda, która zamienia wszystkie litery na wielkie:
function makeCap()
{
return function(obj) {
return obj.toUpperCase();
}
}
var caps2 = map(['a', 'b', 'c'], makeCap()); // ['A','B','C']
console.log(caps2)
Kod w samouczku, który łączysz, używa funkcji częściowych . Same w sobie są trudną koncepcją. Czytanie więcej na ten temat powinno pomóc w wyjaśnieniu, niż mógłbym to uczynić.
Uwaga: jest to kod funkcji mapy używanej przez kod w pytaniu, źródło tutaj .
function map(arr, iterator) {
var narr = [];
for (var i = 0; i < arr.length; i++) narr.push(iterator(arr[i], i));
return narr;
}
arr[5]
. Jeśli numery gdzie Nazwy identyfikatorów można użyć określenia: kropkaarr.5
.