참조 타입

lee jae hwan·2022년 8월 10일

javascript

목록 보기
95/107
let user = {
  name: "John",
  hi() { alert(this.name); },
  bye() { alert("Bye"); }
};
(user.name == "John" ? user.hi : user.bye)();

브라우저에서는 아무것도 출력되지 않는다.


객체메소드를 호출하는 구문은 다음과 같다.
obj.method();

여기에는 연산자가 두개 있다.

점 '.'은 객체프로퍼티 obj.method에 접근하고

괄호 ()는 접근한 프로퍼티가 함수라면 호출한다.


let user = {
  name: "John",
  hi() { alert(this.name); }
}

let hi = user.hi;
hi();

두 연산을 각각 별도의 줄에서 두었다면 this 정보를 잃는 건 확실하다.


자바스크립트 .연산자는 프로퍼티값을 반환하지 않고 참조 타입(Reference Type)값을 반환하도록 명세서에 되어있다.

참조타입 값은 (base, name, strict)의 형태를 가진다.
base: 객체
name: 프로퍼티의 이름
strict: 엄격 모드에서 true

(user, "hi", true)

참조타입값에 괄호 ()를 붙여 호출하면 객체, 객체메서드와 연관된 모든 정보를 받아 호출한다.


그런데 점 연산자 이외의 연산자(할당연산 등)는 참조타입내에 있는 객체정보를 버리고 user.hi값(함수)만 받아 처리한다. 이 때문에 점 이외의 연산에선 this 정보가 사라진다.

obj.method() 같이 점을 사용하거나, objmethod 같이 대괄호를 사용해 함수를 호출했을 때만 this 값이 의도한 대로 전달된다.

0개의 댓글