은닉을 향한 자바스크립트의 여정

클래스 필드 스펙 Stage3까지 올랐다고한다. 곧 Stage4가 표준 스펙이 될거라는데??

타입스크립트 3.8부터 private를 지원, 공부 중에 잠깐 확인한 적이 있었다.

 

  • 표준 스펙이 될 것이다.

    • 스펙이 업데이트될 수 있다.

  • private와 같은 키워드를 사용하지 않고 #을 사용한다.

    • 키워드가 아닌 프리픽스

  • public과 다르게 클래스의 필드 선언을 통해서만 만들 수 있다.

    • 동적으로 객체에 추가할 수 없다.

  • 메서드에는 제한적이며 메서드 선언으로 사용 불가

    • 함수 표현식으로 정의

  • 객체 초기화 구문은 계산된 속성명(computed property name)을 사용할 수 없다.

  • 모든 private 필드는 소속된 클래스에 고유한 스코프를 갖는다.

    • getter 함수를 만들어서 public하게 노출해서 값에 접근 할 수 있다.

    • private를 정의한 클래스를 제외하고 어디에서든 접근이 불가능하다.

 

자바스크립트는 private 속성을 지원하지 않아서 코드를 짤 때 private하게 하기 위해 꼼수를 사용해왔다.

보통 클로저를 통해 캡슐화, 은닉화를 통해 private하게 만들었고,

그렇지 않고서는 언더스코어(_) 프리픽스를 통해 컨벤션으로 이것은 private야라고 해서 쓰기도 했다.


하지만 이게 컨벤션일뿐 모르는 사람이 그냥 외부에서 접근했을때에는 그냥 public이다.

그 후에는 JSDoc을 통해 @private를 표현했다고 한다. 

언더스코어보다 훨씬 명시적이로 문서도 자동화가 되니 자연스럽게 언더스코어의 사용은 줄었고,

글쓴이도 컨벤션에서 제하는것에 찬성했다고 한다. 

나도 글을 보니 사용을 지양하는 것이 좋겠다고 생각했다.

 

원본 글에서 가져온 코드다.
es6를 사용하지 못하는 프로젝트에서 캡슐화 시켜서 private하게 코딩할 때 모듈 패턴을 사용하는데,

이것도 생성자의 인스턴스 컨텍스트별로 private하게 하지 못하기 때문에 도움이 되지 않는다.

function SomeModule() {
  const privateProp = 'dont touch this';
  const publicProp = 'you can touch this';

  _doSomethingWithPrivateProp = () => { ... }

  const publicMethod = () => {
    _doSomethingWithPrivateProp();
    // ...
  }

  return {
    publicProp,
    publicMethod
  }   
}

- 코드 출처 원본 글

 

아래는 symbol에 대해 공부 의지를 불태워 줄 좋은 자료의 코드이다.

es6에서는 더 멋진 꼼수로 private하게 만들 수 있다는 예시라고 하는데, 

(하지만 이제 private를 정식으로 지원한다고 하니까.)

다음에 공부하게 참고해야지.!!

const privateMethodName = Symbol();
const privatePropName = Symbol();

class SomeClass {
  [privatePropName] = 'dont touch this';;
  publicProp = 'you can touch this';

  [privateMethodName]() {
    console.log('private method');
  }

  publicMethod() {
    this[privateMethodName](this[privatePropName]);
  }
}

- 코드 출처 원본 글

 


원본, 코드 출처

https://meetup.toast.com/posts/228

+ Recent posts