-
객체 - 메서드와 thisJavascript 2021. 7. 3. 16:50
객체 프로퍼티에 할당된 함수를 메서드라고 부르고
메서드 내부에서 this 키워드를 사용하면 객체에 접근할 수 있다.
이때 점 앞의 this는 메서드를 호출할 때 사용된 객체를 나타낸다.
let user = { name: "John", age: 30, sayHi: function() { // 'this'는 '현재 객체'를 나타냅니다. alert(this.name); } }; user.sayHi(); // John
여기서 sayHi는 user에 할당된 메서드이다.
this값은 런타임에 결정된다.
자바스크립트에서는 모든 함수에 this를 사용할 수 있다.
동일한 함수라도 다른 객체에서 호출됐다면 'this'가 참조하는 값이 달라진다.
let user = { name: "John" }; let admin = { name: "Admin" }; function sayHi() { alert( this.name ); } // 별개의 객체에서 동일한 함수를 사용함 user.f = sayHi; admin.f = sayHi; // 'this'는 '점(.) 앞의' 객체를 참조하기 때문에 // this 값이 달라짐 user.f(); // John (this == user) admin.f(); // Admin (this == admin) admin['f'](); // Admin (점과 대괄호는 동일하게 동작함)
여기서 this는 각각 점 앞의 객체인 user객체와 admin객체를 참조하게 된다. 따라서 alert(this.name)이 결과값이 John, Admin가 나온다.
화살표함수에는 this가 없어서 화살표함수에서 this를 참조하면 화살표 함수가 아닌 평범한 외부 함수에서 this값을 가져온다.
let user = { firstName: "보라", sayHi() { let arrow = () => alert(this.firstName); arrow(); } }; user.sayHi(); // 보라
함수 arrow()에서 this가 쓰였지만 화살표 함수라서 this는 외부함수인 sayHi()의 this가 되고, 이때 this는 객체 user를 가리키므로
this.firstName = user.firstName = "보라" 이다.
문제
1. 계산기 만들기
calculator라는 객체를 만들고 세 메서드를 구현해 봅시다.
- read()에선 프롬프트 창을 띄우고 더할 값 두 개를 입력받습니다. 입력받은 값은 객체의 프로퍼티에 저장합니다.
- sum()은 저장된 두 값의 합을 반환합니다.
- mul()은 저장된 두 값의 곱을 반환합니다.
풀기
let calculator = { read: function() { this.numberOne = +prompt('첫 번째 숫자 입력','숫자'); this.numberTwo = +prompt('두 번째 숫자 입력','숫자'); }, sum: function() { return this.numberOne + this.numberTwo; }, mul: function() { return this.numberOne * this.numberTwo; } }; calculator.read(); alert( calculator.sum() ); alert( calculator.mul() );
2. 체이닝
up과 down 메서드를 제공하는 객체 ladder이 있다.
let ladder = { step: 0, up() { this.step++; }, down() { this.step--; }, showStep: function() { // 사다리에서 몇 번째 단에 올라와 있는지 보여줌 alert( this.step ); } }; ladder.up().up().down().showStep(); // 1
마지막 줄 처럼 메서드 호출 체이닝이 가능하도록 작성해보자.
let ladder = { step: 0, up() { this.step++; return this; }, down() { this.step--; return this; }, showStep: function() { // 사다리에서 몇 번째 단에 올라와 있는지 보여줌 alert( this.step ); } }; ladder.up().up().down().showStep(); // 1
ladder.up, ladder.down의 결과값이 ladder객체가 되야 하므로 up,down 메서드에 return this; 를 추가하면 객체를 반환하는 메서드 생성 완료
'Javascript' 카테고리의 다른 글
Javascript30 - shift누른 채로 체크 박스 클릭시 그사이의 체크박스 전부 체크되는 미니플젝 (0) 2021.07.04 객체 - new 연산자와 생성자 함수 (0) 2021.07.03 객체 - 참조에 의한 객체 복사 (0) 2021.07.03 객체 - 객체 (0) 2021.07.03 코드 품질 - 테스트 자동화와 Mocha (0) 2021.07.02