아래의 함수에 접근하는 방법은
function func() {
var value = 'private';
}
func()로 호출하는 방법 뿐이다.
new 연산자를 붙여 객체를 생성할 수도 있다.
const obj = new func();
그러나 내부의 value에는 접근할 수 없다.
func()로 호출하면 내부 컨텍스트에서만 실행되고 말 뿐이고
new func()로 obj에 객체로 담는다고 해도
func() 실행시 value는 'private' 값을 담고 더 이상 쓰이지 못하기 때문에
바로 가비지 컬렉터로 간다? (이거는 확신하지 못하겠다.)
다만 value를 클로저에서 가져다 쓴다면 남겨둘 수 있다.
(클로저란 이미 생명 주기가 끝난 외부 함수의 변수를 참조하는 함수다.)
때문에 함수 내부의 변수는 private이라고 할 수 있다.
클로저로만 접근할 수 있다.
참고로 자바에서는 변수 선언할 때 앞에 private을 붙여주면 외부 컨텍스트에서 참조할 수 없게 된다.
자바스크립트는 다른 언어의 private을 이런식으로 구현할 수 있는 것이다.
반대로 함수 내부의 변수를 접근할 수 있도록 만들어 주려면 this를 사용해야 한다.
다시 말해 new func()를 호출해서 만든 객체의 변수에 접근하려면 this를 사용해야 한다.
new는 빈객체를 만들고 this가 이 객체를 가리키게 되고
func() { }에 별다른 return이 없으면
기본적으로 this를 리턴하게 된다.
따라서 func() { } 내부에 this.value = 'public'이 있을 경우
const obj = new func()를 호출 했을 때
반환된 this를 obj가 가리키기 때문에
obj.value로 func() { } 내부의 변수를 참조할 수 있는 것이다.
정확히 따지자면 복제된 인스턴스이지만...
'자바스크립트 > 객체' 카테고리의 다른 글
자바스크립트 객체의 속성을 확인하는 팁 (0) | 2020.05.02 |
---|---|
자바스크립트 new를 이용한 객체 생성 과정 (0) | 2020.03.27 |
클래스 사용법과 2가지 상속 (class, pseudoclassical) (0) | 2020.03.25 |
프로토타입 체인 예제 (0) | 2020.03.19 |
객체지향 프로그래밍이란? 자바스크립트에서 객체를 생성하는 4가지 방법, 프로토타입은 무엇이고 왜 사용해야하는가? (0) | 2020.03.19 |