Które modyfikatory dostępu są implikowane, jeśli nie są określone?

138

Dla wszystkich różnych koncepcji, które obsługują modyfikatory dostępu, takie jak pola, właściwości, metody i klasy, które modyfikatory dostępu są implikowane, jeśli nie zostały określone?

Sam
źródło
@basarat, minęło dużo czasu, odkąd używałem TypeScript, więc ciężko sobie przypomnieć, jak to działa w dzisiejszych czasach! O ile dobrze pamiętam, twoja odpowiedź wyglądała rozsądnie, ale nie sądziłem, że jest na tyle autorytatywna, abym mógł ją oznaczyć jako poprawną. Czy Twoja odpowiedź jest oparta na Twoich doświadczeniach z językiem, czy też na podstawie informacji w specyfikacji?
Sam
1
Aby wyjaśnić to pytanie i odpowiedź, w pytaniu należało zamieścić maszynopis, aby było jasne. Jest tam znacznik maszynopisu, ale to jedyna wskazówka, że ​​nie omawiamy scala, java, C #, C ++, ....
absmiths

Odpowiedzi:

216

Wszystko w a classjest, publicjeśli nie zostało określone. Wszystko w a modulejest prywatne, chyba że exportużyte jest słowo kluczowe.

basarat
źródło
6
Dla osób bawiących się zestawem startowym. Niektóre z nich są dostarczane z tslint i może to być bardzo mylące. Gdy zobaczysz ten komunikat, default access modifier on member/method not allowed zaznacz, tslint.jsonaby zezwolić na domyślny lub niejawny modyfikator dostępu.
visheshd
1
Czy byłoby możliwe użycie kroku poprzedzającego transpile, aby automatycznie przypisać private?
Qwerty
-4

Nie zgadzam się z tym

Wszystko w klasie jest publiczne, jeśli nie zostanie określone.

Wszystko jest publiczne, nawet jeśli używane jest prywatne. Wystarczy spojrzeć na przetransponowany kod. Prywatne metody z adnotacjami będą dostępne publicznie. Tylko transpiling będzie powodować błędy. Zarówno publiczne, jak i prywatne zostaną przekonwertowane na<Object>.prototype.funcName

Jens Peters
źródło
24
Tak, to dobra uwaga. Jednak moje pytanie brzmiało which access modifiers are implied when not specifiedraczej niż can my code be accessed when an access modifier is not specified. Modyfikatory dostępu są raczej koncepcją TypeScript niż JavaScript. Myślę więc, że odpowiedź @ basarat dotyczyła tego, co miałem na myśli w pytaniu i wydaje się być poprawna w kontekście pytania. Być może jest miejsce na ujednoznacznienie sformułowania pytania i odpowiedzi.
Sam
Tak właśnie działa TS, skompiluje twój kod bez względu na to, czy jest "poprawny" z punktu widzenia TS, to oznacza wszystko w TS bez wyjątku dla klas, ale głównym punktem jest to, czy przestrzegasz ostrzeżeń TS - nie zrobisz tego uzyskiwać dostęp do właściwości oznaczonych jako prywatne.
Andrew Bogdanov,
3
Nie przychodzi mi do głowy żaden język, w którym coś jest tak naprawdę prywatne. W C # możesz łatwo dotrzeć do dowolnego prywatnego pola poprzez refleksję. W językach niższego poziomu, takich jak C lub C ++, możesz uzyskać dostęp do prywatnych pól, po prostu przesuwając wskaźniki. Oprócz zabezpieczeń na poziomie systemu operacyjnego, takich jak DEP i zaszyfrowana pamięć, modyfikatory dostępu są po prostu pomocą kompilatora, która pomaga pisać lepszy kod. ...Dobrze?
pbarranis
@pbarranis Prywatne pola JavaScript są w rzeczywistości prywatne i nie ma możliwości uzyskania do nich dostępu z poziomu środowiska wykonawczego JavaScript.
Yogu