자바스크립트에서 this가 가리키는 객체는 상황에 따라 조금씩 다르기 때문에
확실히 정리하지 않으면 디버깅의 늪에서 헤어나올 수 없다.
1. 함수와 메소드
자바스크립트에서 function은 함수와 메소드로 구분한다.
어떤 객체에도 포함되지 않은 function을 함수라 하고
전역 객체가 아닌 객체에 포함된 function을 메소드라 한다.
함수 안에서의 this는 전역 객체(window)를 가리키고
function func() {
console.log(this);
}
func(); // this = window
메소드 안에서의 this는 부모 객체를 가리킨다.
var obj = {
method() {
console.log(this);
}
}
obj.method(); // this = obj;
다음과 같은 경우 때문에 많이 헷갈린다.
var obj = {
method() {
[1, 2, 3].forEach(function(number) {
console.log(number, this);
})
}
}
obj.method(); // this = window
언뜻보면 this가 obj를 가리킨다고 생각할 수 있지만
앞서 언급한 함수와 메소드의 차이를 생각하면
forEach 안에 함수가 있고 함수 안에 this가 있기 때문에 this는 window가 된다.
만약 this가 obj를 가리키게 하고 싶다면
this가 없는 함수인 화살표 함수를 사용할 수 있다.
일반 함수와 달리 화살표 함수 안에서는 this가 없기 때문에
화살표 함수 안에서 this를 부르면 부모(method)의 this를 가져오게 된다.
이는 scope 법칙이다.
var obj = {
method() {
[1, 2, 3].forEach((number) => {
console.log(number, this);
})
}
}
obj.method(); // this = obj
2. 생성자 함수
자바스크립트에서는 함수를 호출할 때 new 키워드를 이용해서 객체를 생성할 수 있다.
var Func = function (name) {
this.name = name;
console.log(this);
// return this;
}
var func = new Func('socratone'); // this = func
new 키워드가 붙으면 빈 객체를 만들고 // {}
생성자 함수가 호출될 때 this가 이 빈 객체를 가리키게 된다.
그리하여 this 안에 name과 같은 속성을 넣다가
자동으로 this를 리턴하게 되어
func가 this를 받고 func를 통해서 this가 끌어왔던 속성들을 쓸 수 있게 된다.
func.name; // 'socratone'
'자바스크립트 > 객체' 카테고리의 다른 글
객체 지향 프로그래밍의 4가지 특징 (0) | 2020.10.01 |
---|---|
자바스크립트 객체의 속성을 확인하는 팁 (0) | 2020.05.02 |
자바스크립트 new를 이용한 객체 생성 과정 (0) | 2020.03.27 |
자바스크립트 함수 내부의 변수는 private이다? private 구현하는 법 (0) | 2020.03.26 |
클래스 사용법과 2가지 상속 (class, pseudoclassical) (0) | 2020.03.25 |