[JS] this

deeยท2022๋…„ 10์›” 13์ผ

javascript

๋ชฉ๋ก ๋ณด๊ธฐ
2/3
post-thumbnail

this๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

์ฐธ์กฐ 1. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ์ง์ ‘ ์ฐธ์กฐ.
๋Œ€์ฒด๋กœ ์ผ๋ฐ˜์ ์ด ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๊ณ  ๋ฐ”๋žŒ์งํ•œ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

์ฐธ์กฐ 2 & 3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜
ํ•จ์ˆ˜ ๋ชธ์ฒด์— ์„ ์–ธํ•œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„์ง ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.
new ์—ฐ์‚ฐ์ž ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์ „์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

// ๊ฐ์ฒด
const cart = {
	total: 0,
  	addTotal(num){
      	// ์ฐธ์กฐ 1
    	return cart.total += num; 
    }  
}

console.log(cart.addTotal(10)); // 10

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Cart(num) {
  // ์ฐธ์กฐ 2
  ????.total = num;
}

Cart.prototype.addTotal = function (num) {
  return (????.total += num);
};

// ์ฐธ์กฐ 3
const cart2 = new Cart(5);

๐Ÿง ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŠน์ˆ˜ํ•œ ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


this๋ž€?

  • ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋‚˜ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜. (self-referencing variable)
  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด arguments ๊ฐ์ฒด์™€ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ.
  • this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •.
    ๐Ÿšจ ๋‹ค๋ฅธ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด๋Š” ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ญ์ƒ ๊ฐ€๋ฆฌํ‚ด.
  • this ๋ฐ”์ธ๋”ฉ : ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •.
  • ์ „์—ญ์—์„œ this๋Š” window.
  • strict mode์ผ ๋•Œ ์ผ ๋ฐ˜ ๋‚ด๋ถ€ํ•จ์ˆ˜ ๋‚ด์—์„œ๋Š” undefined.
// ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด
const cart = {
	total: 0,
  	list: [],
  	addItem(newItem){
      	// this๋กœ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ.
    	this.list.push(newItem);
      	this.total += newItem.price; 
    },
  	getTotal(){
    	return this.total;
    }  
}

cart.addItem({ name: 'apple', price: 1000 });
cart.addItem({ name: 'banana', price: 2500 });
console.log(cart.getTotal()); // 3500

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ this

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹this ๋ฐ”์ธ๋”ฉ
์ผ๋ฐ˜ ํ•จ์ˆ˜window
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this
๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒดย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย 
์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค
Function.prototype.apply/call/bind
๋ฉ”์„œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ
์ธ์ˆ˜์— ์˜ํ•ด ๊ฒฐ์ •

์œ„์˜ ๋‚ด์šฉ ์ค‘ ์„ธ๋ถ€์ ์œผ๋กœ ์‚ดํŽด๋ณผ ํ•ญ๋ชฉ์ด ์žˆ๋Š”๋ฐ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์ด๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ด๊ณ  ๋‚ด๋ถ€์˜ this๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ์ด๋Š” ์œ„์˜ ํ‘œ์™€ ๊ฐ™์ด ์ „์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

  • ๋ฌธ์ œ์  : ๋ฉ”์„œ๋“œ์˜ this์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ—ฌํผ ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : apply / call / bind ํ•จ์ˆ˜๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ค€๋‹ค.
ํ•จ์ˆ˜ํŠน์ง•
apply
callย ย ย ย ย ย ย ย 
๋ณธ์งˆ์ ์ธ ๊ธฐ๋Šฅ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ.
ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํŠน์ • ๊ฐ์ฒด๋ฅผ
ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์˜ this์— ๋ฐ”์ธ๋”ฉ.
bindํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
this ๋ฐ”์ธ๋”ฉ์ด ๊ต์ฒด๋œ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜.

๐Ÿ‘ ์˜ค๋Š˜์˜ ๊ณต๋ถ€ ์ผ๊ธฐ

this๋Š” ํ•ญ์ƒ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. this๊ฐ€ ํ˜ธ์ถœ ์‹œ์ ์— ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ ์ด๋ก ์„ ์•Œ๊ณ ๋„ ๊ฐ์ฒด ๋‚ด์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ธฐ๊ธฐ๊ณ  ๋จธ๋ฆฟ์†์ด ๋ณต์žกํ•ด์ง„๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ฐœ๋…์ ์œผ๋กœ ์ •๋ฆฌ๋ฅผ ํ•˜๋ฉด์„œ ํ•ญ์ƒ ๋ณต์Šต์„ ํ•˜๋ฉฐ this์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์•Œ์•„๊ฐ€๋„๋ก ํ•˜์ž.



์ฐธ๊ณ  ์ž๋ฃŒ
์ด์›…๋ชจ, ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive, ์œ„ํ‚ค๋ถ์Šค
https://joontae-kim.github.io/2020/11/02/js-oop-2/
https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

profile
์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€