Możesz użyć, Object.getOwnPropertyNames()
aby uzyskać wszystkie właściwości należące do obiektu, bez względu na to, czy są one wyliczalne, czy nie. Na przykład:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
Następnie można użyć, filter()
aby uzyskać tylko metody:
console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]
W przeglądarkach ES3 (IE 8 i niższych) właściwości wbudowanych obiektów nie są wyliczalne. Obiekty takie jak window
i document
nie są wbudowane, są zdefiniowane przez przeglądarkę i najprawdopodobniej są policzalne według projektu.
Z ECMA-262 wydanie 3 :
Obiekt globalny
Istnieje unikalny obiekt globalny (15.1), który jest tworzony, zanim kontrola wejdzie w kontekst wykonywania. Początkowo obiekt globalny ma następujące właściwości:
• Wbudowane obiekty, takie jak Math, String, Date, parsInt itp. Mają atrybuty {DontEnum} .
• Dodatkowe właściwości zdefiniowane przez hosta. Może to obejmować właściwość, której wartością jest sam obiekt globalny; na przykład w modelu obiektu dokumentu HTML właściwością window obiektu globalnego jest sam obiekt globalny.
Gdy kontrola wchodzi w konteksty wykonawcze i podczas wykonywania kodu ECMAScript, do obiektu globalnego można dodawać dodatkowe właściwości, a właściwości początkowe można zmieniać.
Powinienem zaznaczyć, że oznacza to, że te obiekty nie są policzalnymi właściwościami obiektu Global. Jeśli przejrzysz resztę dokumentu specyfikacji, zobaczysz, że większość wbudowanych właściwości i metod tych obiektów ma { DontEnum }
ustawiony atrybut.
Aktualizacja: inny użytkownik SO, CMS, zwrócił moją uwagę na błąd IE{ DontEnum }
.
Zamiast sprawdzania atrybutu DontEnum, [Microsoft] JScript pominie dowolną właściwość w dowolnym obiekcie, w którym w łańcuchu prototypów obiektu ma właściwość o tej samej nazwie, która ma atrybut DontEnum.
Krótko mówiąc, strzeż się, nazywając właściwości obiektu. Jeśli istnieje wbudowana właściwość lub metoda prototypu o tej samej nazwie, IE pominie ją podczas korzystania z for...in
pętli.