여니의 프로그래밍 study/JavaScript

4-4 메서드와 'this' (Javascript)

여니's 2021. 3. 11. 16:26

자바스크립트에선

객체의 프로퍼티에 함수를 할당해

객체에게 행동할 수 있는 능력을 부여해준다.

 



메서드 내부에서 this 키워드를 사용하면,

객체에  접근할 수 있습니다.

 

this 키워드는 

메서드를 호출할 때 사용된 객체를 나타낸다.

위 코드 user.sayHi() 부분을 보면 user가 이에 해당한다.

 

즉, this == 호출한 객체!

bind함수를 이용해서 묶어주면 this를 반환한다.

 

즉 호출 시점에서 이 함수를 property로 가지는 객체를 의미한다.

this 값은 내가 어디에서 호출하느냐에 따라 값이 변한다.

(=this의 값은 함수를 호출하는 방법에 의해 결정된다.)

 

 

이 코드에서

this를 빼면,

아무런 값도 출력되지 않는다.

function makeUser() {
	return {
		name: "John",
		ret(){
			return this;
		}
	};
};
let user = makeUser();
alert( user.ref.name ); 

user.name으로 하면?

예상치 못한 에러가 발생할 수 있다.

user의 값이 변하게 되면,

sayHi 함수는 원치 않는 값을 참조하게 된다.

 

this값은 런타임시 결정된다.

즉, 호출 시점에 결정된다.

동일한 함수일지라도 다른 객체에서 호출했다면,

this가 참조하는 값이 달라진다.

점 앞의 객체가 무엇인가에 따라 자유롭게 결정된다.

 

 

 


메서드 vs 함수

메서드는 클래스 및 객체와 연관되어 있는 함수

클래스 내에 선언되어 있는 함수가 바로 메서드이고,

 

그것들과 상관없이 독립적으로 존재하는 것은 함수이다.

함수가 메서드보다 더 큰 개념이다.

 

 

 

 


화살표 함수

: 고유한 this를 가지지 않는다.

let user={
      name:'John',
      age:33,

      sayHi(){
        let allow = ()=>alert(this.name);
        allow();
      // this는 현재 객체를 의미한다
      // 즉 this는 user다
      }
    };

    user.sayHi();

 

... 이해가 되지 않는다 ㅠㅠ

나중에 더 찾아볼 것

 

 


 

자바 스크립트에는 클래스가 없다.

js엔진은 객체에서 property를 찾을 수 없으면,

그 객체의 prototype에서 찾는다.

 

prototype은 property lookup의 fallback으로서 기능한다..?

 

new 키워드

> js의 prototype 기반의 객체지향구조를 자바처럼 쓸 수 있도록 한다.

 


과제


참조

ko.javascript.info/object-methods

 

메서드와 'this'

 

ko.javascript.info