본문 바로가기

모던 자바스크립트

4.4 메서드와 'this'

📢 객체는 사용자(user), 주문(order) 등과 같이 실제 존재하는 개체(entity)를 표현하고자 할 때 생성된다. 

자바스크립트에선 객체의 프로퍼티에 함수를 할당해 객체에게 행동할 수 있는 능력을 부여해준다. 

 

메서드(method) 만들기

📢 객체 프로퍼티에 할당된 함수

◾️ 함수 표현식으로 함수를 만들고, 객체 프로퍼티 user.sayHi에 함수를 할당해 준다. 

◾️ 이미 정의된 함수를 이용해서 만들 수도 있다. 

let user = {
   name: 'suzu',
   age: 30
};

user.sayHi = function () {
   alert('Hi!');
}

user.sayHi(); // Hi!

 

객체 지향 프로그래밍(object-oriented programming, OOP)

객체를 사용하여 개체를 표현하는 방식.
에릭 감마의 'GoF의 디자인 패턴', 그래디 부치의 'UML을 활용한 객체지향 분석 설계'

 

메서드 단축 구문

◾️ 객체 리터럴 안에 메서드를 선언할 때 사용할 수 있는 단축 문법

◾️ 일반적인 방법과 단축 구문을 사용한 방법이 완전히 동일하진 않는다. (객체 상속과 관련된 미묘한 차이가 존재)

user = {
   sayHi: function () {
      alert('Hi!');
   }
}

//단축문법
user = {
   sayHi() {
      alert('Hi!');
   }
}

 

 

메서드와 'this'

◾️ 메서드는 객체 프로퍼티의 값을 활용할 수 있다.  

◾️ 메서드 내부에서  this 키워드를 사용하면 객체에 접근할 수 있다.

◾️ this는 메서드를 호출할 때 사용된 객체를 나타낸다. → 객체 user

let user = {
   name: 'suzu',
   age: 30,
   
   sayHi () {
   	alert(this.name);
   }
};

user.sayHi(); // suzu

◾️ 외부 변수를 참조해 객체에 접근할 수도 있다. 

◾️ user에 다른 값을 덮어쓰면 sayHi()는 원치 않는 값(null)을 참조하게 되면서 에러가 발생한다. 

let user = {
   name: 'suzu',
   age: 30,
   
   sayHi () {
     alert(user.name);
   }
};

let admin = user;
user = null;

admin.sayHi(); // Error: Cannot read property 'name' of null

 

자유로운 'this'

◾️ 자바스크립트에서는 모든 함수에 this를 사용할 수 있다. 

◾️ this 값은 runtime에 결정된다. 문맥(Context)에 따라 달라진다. 

◾️ 동일한 함수라도 다른 객체에서 호출했다면 'this'가 참조하는 값이 달라진다. 점(.)앞의 객체를 참조한다. 

let user = { name: "suzu" };
let admin = { name: "Admin" };

function sayHi() {
  console.log ( this.name );
}

user.f = sayHi;
admin.f = sayHi;

user.f(); // suzu  (this == user)
admin.f(); // Admin  (this == admin)

admin['f'](); // Admin

function sayHi() {
  alert(this);
}

sayHi(); // undefined

 

'this'가 없는 화살표 함수

◾️ 화살표 함수는 일반 함수와는 달리 '고유한' this를 가지지 않는다. 

◾️ 화살표 함수에서 this를 참조하면 화살표 함수가 아닌 일반 외부 함수에서 this값을 가져온다

◾️ 별개의 this가 만들어지는 건 원하지 않고, 외부 컨텍스트에 있는 this를 이용하고 싶은 경우 화살표 함수가 유용하다. 

let user = {
  name: "suzu",
  sayHi() {
    let arrow = () => alert(this.name);
    arrow();
  }
};

user.sayHi(); // suzu

 

 

📝 요약

◽️ 메서드 : 객체 프로퍼티에 저장된 함수
◽️ object.doSomthing() : 객체를 '행동'할 수 있게 해준다. 
◽️ 메서드는 this로 객체를 참조한다. 
◽️ this 값은 런타임에 결정된다. 
◽️ 함수를 선언할 때 this를 사용할 수 있다. 다만, 함수가 호출되기 전까지 this엔 값이 할당되지 않는다. 
◽️ 함수를 복사해 객체 간 전달 할 수 있다. 
◽️ 함수를 객체 프로퍼티에 저장해 object.method()같이 '메서드'형태로 호출하면 this는 object를 참조한다. 
◽️ 화살표 함수는 자신만의 this를 가지지 않는다. 화살표 함수 안에서 this를 사용하면, 외부에서 this값을 가져온다. 

https://riptutorial.com/

➕ MDN_화살표 함수

바인딩 되지 않은 this

◾️ 화살표 함수전까지는, 모든 새로운 함수는 자신의 this 값을 정의했다. 

    ◾️ 생성자 함수인 경우 : this → 새로운객체

    ◾️ 엄격 모드 함수 호출 : this → undefined

    ◾️ 객체 메서드로서 호출  : this → 문맥 객체

 

◾️ 화살표 함수는 전역 컨텍스트에서 실행될 때 this를 새로 정의하지 않는다. 

◾️ 코드에서 바로 바깥의 함수(혹은 class)의 this값이 사용된다. → this를 클로저 값으로 처리



📝 오늘 새롭게 배운 내용 📝

 

✅ this는 함수가 실행될 때 정해진다.  

✅ 일반 함수의 this와 화살표 함수의 this : 100% 이해는 못함 

✅ this...........

 

 

📌 [JAVASCRIPT_INFO 메서드와 this]

 

메서드와 'this'

 

ko.javascript.info

📌 [MDN 자바스크립트의 화살표 함수]

 

화살표 함수

화살표 함수 표현(arrow function expression)은 function 표현에 비해 구문이 짧고  자신의 this, arguments, super 또는 new.target을 바인딩 하지 않습니다. 화살표 함수는 항상 익명입니다. 이  함수 표현은 메��

developer.mozilla.org

📌 [MDN 자바스크립트의 this]

 

this

JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.

developer.mozilla.org

 

 

 

 

 

'모던 자바스크립트' 카테고리의 다른 글

4.6 옵셔널 체이닝 '?.'  (0) 2020.08.11
4.5 'new' 연산자와 생성자 함수  (0) 2020.08.10
4.3 가비지 컬렉션  (0) 2020.08.06
4.2 객체 - 참조에 의한 객체 복사  (0) 2020.08.05
4.1 객체 - 객체  (0) 2020.08.04