Những sửa đổi truy cập được ngụ ý khi không được chỉ định?


138

Đối với tất cả các khái niệm khác nhau hỗ trợ các công cụ sửa đổi truy cập, chẳng hạn như các trường, thuộc tính, phương thức và lớp, bộ điều chỉnh truy cập nào được ngụ ý nếu không được chỉ định?


@basarat, đã lâu rồi tôi mới sử dụng TypeScript, vì vậy thật khó để nhớ nó hoạt động như thế nào trong những ngày này! Theo tôi nhớ, câu trả lời của bạn có vẻ hợp lý, nhưng tôi không cảm thấy nó đủ thẩm quyền để tôi đánh dấu nó là chính xác. Là câu trả lời của bạn dựa trên kinh nghiệm của bạn với ngôn ngữ, hoặc là từ thông tin trong thông số kỹ thuật?
Sam

dựa trên đặc điểm kỹ thuật github.com/Microsoft/TypeScript/blob/master/doc/spec.md
basarat

1
Để làm rõ câu hỏi và câu trả lời này, bản thảo cần được chỉ định trong câu hỏi để làm cho nó rõ ràng. Có một thẻ bản in, nhưng đó là dấu hiệu duy nhất chúng ta không thảo luận về scala, java, C #, C ++, ....
absmiths

Câu trả lời:


216

Tất cả mọi thứ trong một classpublicnếu không được chỉ định. Tất cả mọi thứ trong một modulelà riêng tư trừ khi exporttừ khóa được sử dụng.


6
Đối với những người chơi với một bộ khởi động. Một số trong số họ vận chuyển với tslint và nó có thể rất khó hiểu. Khi bạn thấy thông báo này default access modifier on member/method not allowed Kiểm tra tslint.jsonđể cho phép sửa đổi truy cập mặc định hoặc ngụ ý.
visheshd 15/03/2016

1
Có thể sử dụng một bước tiền mã hóa để tự động gán private?
Qwerty

-4

Tôi không đồng ý rằng

Tất cả mọi thứ trong một lớp là công khai nếu không được chỉ định.

Tất cả mọi thứ là công khai, ngay cả khi tư nhân được sử dụng. Chỉ cần nhìn vào mã được phiên mã. Phương pháp chú thích riêng sẽ có sẵn công khai. Chỉ có transpiling sẽ ném lỗi. Cả công khai và riêng tư sẽ được chuyển đổi thành<Object>.prototype.funcName


24
Vâng, đây là một điểm tốt. Tuy nhiên, câu hỏi của tôi là which access modifiers are implied when not specifiedhơn can my code be accessed when an access modifier is not specified. Công cụ sửa đổi truy cập là một khái niệm TypeScript chứ không phải là một khái niệm JavaScript. Vì vậy, tôi nghĩ rằng câu trả lời của @ basarat đã giải quyết những gì tôi muốn nói trong câu hỏi và dường như là chính xác trong bối cảnh của câu hỏi. Có lẽ có một số chỗ để phân biệt từ ngữ trong câu hỏi và câu trả lời.
Sam

Đó chỉ là cách TS hoạt động, nó sẽ biên dịch mã của bạn cho dù nó "đúng" theo quan điểm của TS, điều này ngụ ý mọi thứ trong TS không có ngoại lệ đối với các lớp, nhưng điểm chính là nếu bạn tôn trọng cảnh báo của TS - bạn sẽ không được truy cập các thuộc tính được đánh dấu là riêng tư.
Andrew Bogdanov

3
Tôi không thể nghĩ về bất kỳ ngôn ngữ nào mà một cái gì đó thực sự là riêng tư. Trong C #, bạn có thể dễ dàng nhận được tại bất kỳ lĩnh vực riêng tư nào thông qua sự phản chiếu. Trong các ngôn ngữ cấp thấp hơn như C hoặc C ++, bạn có thể nhận được tại các trường riêng chỉ bằng cách di chuyển con trỏ xung quanh. Thiếu các biện pháp bảo vệ ở cấp độ HĐH, như DEP và bộ nhớ được mã hóa, các công cụ sửa đổi truy cập chỉ là hỗ trợ do trình biên dịch cung cấp để giúp bạn viết mã tốt hơn. ...Đúng?
pbarranis

@pbarranis Các trường JavaScript riêng tư thực sự là riêng tư và không có cách nào để truy cập chúng từ trong thời gian chạy JavaScript.
Yogu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.