함수는 무엇일까? 하나 이상의 문장, 식이 특정 하나의 기능을 위해 작성 된 것이라고 표현 할 수 있겠다. 뭐 물론 문장이라고 하였지만, 하나의 식(expression)으로도 표현 가능 할 것이다.
그러면 메서드란 무엇일까? 객체지향 언어를 배우다보면 메서드라는 표현을 처음 듣게 된다. 간단하게 클래스혹은 구조체 내에 정의된 함수라고 표현 하면 될 것 같다.
당연하게도 자바스크립트도 (프로토타입기반) 객체지향 언어이기 때문에 메서드라는 개념이 있다.
(참고 ES6 표준으로 제시된 class는 새로운 객체지향 모델을 지원하는 것이 아니라 기존의 프로토타입 기반의 객체지향을 위한 Syntacitc Sugar일 뿐 오해하지 말자.)
자바스크립트에서의 메서드
const person = {
name: 'sejiowrk',
hi() {
console.log(`안녕하세요. ${this.name}입니다.`)
}
}
자바스크립트에서의 메서드정의는 Java, C++등과 비교하여 간편하다 class를 따로 정의할 필요도 없으며, new 키워드를 사용 하여 인스턴스화 할 필요없이 리터럴 객체를 만들어서 정의할 수 있다. 뭐 물론 필요하다면, class 혹은 function을 이용하여 좀 더 다른 언어들과 유사하게 만들어주는 것도 가능 하므로 선택은 자유이다.
hi 함수는 메서드이기 때문에 자신이 속해있는 객체의 name을 사용할 수 있게 된다. 당연하게도 hi는 메서드이전에 함수이다.
잃어버린 this
(person.hi || function () { })()
두 경우 모두 hi가 속해 있는 객체 person의 name을 가져올 수 없게 되었다. 해당 내용이 의아 할 수 있는데, 간단하게 보자.
const personHi = person.hi
personHi()
자 위의 코드를 보자 personHi는 메서드인가? 뭐 눈치채셨겠지만 함수로써 작동을 할 것이라 예상 할 것이다. 그렇다면 자바스크립트는 메서드라는 것을 어떻게 특정 할까?
자바스크립트에서는 우리가 person.hi()를 호출하게 되면
참조 레코드를 생성하고 ( [[base]], [[ReferencedName]], [[strinct mode]] ) 해당 레코드를 실행 한다고 생각 하면 된다. 즉 아래와 같다고 생각 하면 된다.
person.hi() :== ( person, 'hi', [true | false] )() 이 처럼 어떤객체의 어떤 키를 갖고 있는 함수를 실행 할 지 이다.
하지만 특정 연산이 가해진다면 메서드로 처리 하는 대신 함수로써 실행이 되는 것이다.
댓글
댓글 쓰기