- 전달인자 확인법
- arguments
- 전달인자 근원 확인법
- arguments.callee.caller를 치면 해당 함수를 어디서 호출했는지 알 수 있다
- 개발자도구의 Call Stack을 보면 각 함수가 어디서 호출했는지도 확인 가능.
객체.메소드()
let counter1 = {
value: 0,
increase: function() {
this.value++ // 메소드 호출을 할 경우, this는 counter1을 가리킵니다
},
decrease: function() {
this.value--
},
getValue: function() {
return this.value
}
}
counter1.increase() // 1 → +1
counter1.increase() // 2 → +1+1
counter1.increase() // 3 → +1+1+1
counter1.decrease() // 2 → +1+1+1-1
counter1.getValue() // 2
인스턴스.메소드()
class Counter {
constructor() {
this.value = 0; // 생성자 호출을 할 경우, this는 new 키워드로 생성한 Counter의 인스턴스입니다
}
increase() {
this.value++
}
decrease() {
this.value--
}
getValue() {
return this.value
}
}
let counter1 = new Counter() // 생성자 호출
counter1.increase()
counter1.getValue() // 1
var add = function(x, y) {
this.val = x + y;
}
var obj = {
val: 0
};
add.apply(obj, [2, 8]);
console.log(obj.val); //10
add.call(obj, 2, 8);
console.log(obj.val); // 10
// null을 this로 지정합니다. Math는 생성자가 아니므로 this를 지정할 필요가 없습니다.
Math.max.apply(null, [5,4,1,6,2]) // 6
// spread operator의 도입으로 굳이 apply를 이용할 필요가 없어졌습니다.
Math.max(...[5,4,1,6,2]) // 6
// '피,땀,눈물'을 this로 지정합니다.
''.split.call('피,땀,눈물', ',')
// 다음과 정확히 동일한 결과를 리턴합니다.
'피,땀,눈물'.split(',')
실용예제
상속을 구현하기 위한 call,apply 사용
function Product(name, price) {
this.name = name
this.price = price
}
function Food(name, price) {
Product.call(this, name, price)
// 인자가 많으면 Product.apply(this, arguments) 가 더 유용합니다.
this.category = 'food'
}
let cheese = new Food('feta', 5000) // cheess는 Food이면서 Product입니다.
그외 참조사이트
[JavaScript] This의 특징과 5가지 패턴