자바 스크립트의 캡슐화

이것은 오늘”알 개발자를위한 자바 스크립트”시리즈의 마지막 게시물이 될 것입니다. 나는 거의 순수한 자바 스크립트 물건에 대해 블로깅을 계속하는 경우,이 사실 탐색 블로그 또는 자바 스크립트 하나 인 경우 합리적으로 요청할 수 있습니다. 그것은 여전히 탐색이며,내가 쓰려고하는 것은 순전히 자바 스크립트 개념이지만,나는 어떤 컨트롤 추가 기능 개발자에게도 관련성이 높다는 것을 알게됩니다. 그래서,내 맥주를 잡고,다른 하나를 위해 나와 함께 곰.

자바 스크립트에 대해 자주 듣는 불만 중 하나는 자바 스크립트에 캡슐화가 없다는 것입니다. 이것은 완전히 거짓이라는 사실을 제외하고는 거의 완전히 사실입니다.

처음에는 문제가 어디에 있고 그 해결책은 무엇입니까? 잠수 해 봅시다.

문제

생성자를 선언한다고 상상해보십시오. (불행히도 컨트롤 추가 기능이 탐색 및 비즈니스 센트럴이 지원되는 모든 플랫폼과 완벽하게 호환되도록 하려면 사용해야 합니다.)

이것은 내 코드입니다:

분명히,이것은 나의 현재 나이 인 42 를 보여줍니다.

곧,내 생일이 될 것입니다.43:

지금,나는 절대적으로 실제 생활에서이 같은 일을 할 수 싶어요 동안:

… 그런 일은 일어나지 않을 겁니다. 괜찮은 객체 지향 세계에서”나이”는 캡슐화 된 속성이어야하며 비 예코를 호출 할 수 없어야합니다.나이=25 전혀. 기음#과”정상”객체 지향 언어는 캡슐화의 개념을 가지고,그들은 개인 필드를 사용하여이를 처리 할 수 있지만,자바 스크립트는 개인의 개념이 없습니다. 객체 생성자 내부(또는 나중에 생성 된 객체의 인스턴스)에 정의 된 모든 것은 해당 인스턴스에 액세스 할 수있는 모든 코드에 완전히 액세스 할 수 있습니다. 위의 예에서 누구나 나이를 설정하고 멀리 얻을 수 있습니다.

자바 스크립트에 캡슐화가 없다고 말할 수 있습니다. 그리고 위에서 말했듯이,당신은 완전히 틀렸을 것입니다.

해결책

어떤 것도 비공개로 직접 선언 할 수 없다는 것은 분명하지만 여전히 사용할 수있는 것들이 있습니다. 편리 한 아름 다운 개념 폐쇄 라고 합니다. 폐쇄는 모든 인터넷을 통해 블로그,문서 사이트 및 코드 예제의 백만에 길이 설명되어 있습니다,당신은 당신의 자신의 속도로 그들을 밖으로 구글 수 있습니다,그래서 여기에 폐쇄를 설명 탐구하지 않습니다. 나는 단순히 캡슐화 문제를 해결하기 위해 그들을 적용하는 것에 바로 뛰어들 것이다.

적어도 두 가지 방법으로 처리 할 수 있습니다. 액세스 기능:의 먼저 더 명백한 하나를 수행 할 수 있습니다.

당신이 객체를 수행 할 수없는 속성이없는 세계를 상상해보십시오.속성=값(예:예코.나이=25 우리의 경우,나는 완전히 그것을 사랑하는만큼!). 그 세계에서,당신은 게터와 세터 기능을 가질 것입니다:

(잠시 동안 나는 아직도 이것을 사용하고 있다는 사실을 무시하십시오.”속성”을”캡슐화”하는 나이)

분명히 다음과 같이 호출 할 수 있습니다:

당신은 읽기 전용으로 나이를 원한다면 그런 다음,당신은 단순히 세티지 세터 기능을 드롭 것입니다. 이 경우.나이는 정말 사적인 것이 었습니다(그렇지 않습니다),이것은 당신을 위해 트릭을 할 것입니다. 문제는 이것에 정의 된 것은 아무 것도 비공개이며 객체의 인스턴스에 액세스 할 수있는 모든 사람이 액세스 할 수 있다는 것입니다. 그것은 얻는 것처럼 공개적입니다.

이 문제를 해결하려면 먼저 게터 함수 선언을 프로토타입에서 인스턴스로 이동해야 합니다. 프로토타입 멤버는 런타임에 정적 멤버와 인스턴스 멤버의 특정 행동 특성을 가지고 있음에도 불구하고 정적 멤버라고 부르는 것과 가장 가깝습니다. 그러나 먼저 멤버를 프로토타입에서 인스턴스로 이동시켜 보겠습니다:

이것은 문제의 첫 번째 부분,즉 게타이지가 인스턴스가 아닌 프로토타입에서 정의되었다는 사실만을 해결합니다. 그러나 다음과 같은 간단한 변경으로:

… 우리는 문제를 완전히 해결합니다:

나이는 이제 완전히 캡슐화됩니다. 당신은 게터 기능을 통해 액세스 할 수 있지만,이 기능의 클로저 범위에서만 액세스 할 수 있기 때문에 직접 설정할 수 없습니다.게티지 인스턴스 기능.

사용자 클래스를 완전히 구현하려면 프로토타입에서 인스턴스로 확장 함수를 이동해야 합니다:

그리고 이것은 당신이 원하는대로 정확하게 작동합니다:

그러나 그것은 왜 작동합니까? 그것은 폐쇄 때문에 작동합니다. 생성자의 연령 매개 변수는 이러한 함수 모두에서 그 값에 액세스 할 수 있지만,다른 곳에서는 다른 사람이 완전히 액세스 할 수 있도록,모두 게타지 및 성장 더 함수의 클로저 범위에서 캡처되었습니다.

더 나은 솔루션

게터 함수를 통해 액세스하고 싶지 않으며 완전한 읽기 전용 속성 구문이 필요하다고 말할 수 있습니다. 당신은 당신의 나이를 읽기 전용과 동시에 캡슐화 할 수 있습니다. 잡았다! 자바 스크립트는 캡슐화 할 수 없습니다! 그것이 절대적으로 할 수 있다는 것을 제외하고.

나는 객체를 해결.정의 속성 방법 내 이전 게시물에서,그리고 당신이 그 것을 읽으면,당신은 즉시 그것이 어떻게 여기에 적용될 수 있는지 볼 수 있습니다.

자,사람 클래스의 읽기 전용 인스턴스 속성을 정의 할 수 있습니다:

저기 그것은 아프지 않았다. 그리고 그것은 작동합니다:

그래서 당신은 그것을 가지고 있습니다. 자바 스크립트에 본격적인 캡슐화는 좋은,고립 된 코드를 작성하는 데 도움이,실제 킥에 컨트롤 추가 기능을 취할 수 있습니다-$$수준.

해피 자바 스크립팅,나는(기음/)알 개발자를위한 다른 시원하고 유용한 자바 스크립트 팁과 트릭에 대한 블로그에 더 많은 시간을 얻을 수 있도록 노력하겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.