์ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ธ ๋ ์ฐ๋ผ๋๋๋ก ํจ์๋ฅผ ์ฐ๊ณ this ๋ ๊ทธ๋ฅ์ผ์ง๋ง,
๋ช๊ฐ์ ํ๋ก์ ํธ๋ฅผ ๊ฒฝํํ๊ณ ๋์ ๋ค์ ๊ณต๋ถํด๋ณด๋ JS๋ ์ ๋ง ์ ๊ธฐํ๊ณ ์ฌ๋ฐ๋ ๋๊ตฌ์ด๊ตฌ๋ .!
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์
JS์ ํจ์ : ์์ ๋ง์ this๋ฅผ ์ ์ํ๋๊ฒ
์์๋ก sayHello ๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ this๋ฅผ ์คํ์ํค๋ฉด Window ๊ฐ์ฒด๊ฐ ๋์จ๋ค.
์ฆ JS์์ ๊ธฐ๋ณธ์ ์ธ this = windowr๊ฐ์ฒด ๋ผ๋๊ฒ
๋๋ sayHello์์ window๋ฅผ ์ฐ๊ณ ์ถ์ง ์๋ค. this๋ฅผ ๊ทธ๋๊ทธ๋ ์๋ง์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ผ ํ๋๋ฐ ์ด๊ฒ์ด ๋ฐ๋ก
this์ binding!
this๋ฅผ ์๋ง๊ฒ ๋ฐ๊ฟ์ฃผ๋ ํจ์๊ฐ ์๋๋ฐ ๊ทธ๊ฒ์ด ๋ฐ๋ก call apply, bind์ด๋ค .
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๋ฅผ ๋ง์ด ๋ค๋ฃจ๊ณ this๋ฅผ ๋ค๋ค์ผ ํ ๊ฒฝ์ฐ๊ฐ ๋ง์!!
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ฉ์๋๋ฅผ ํตํด ํจ์๋ฅผ ํธ์ถ ํ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ฉด ํธ์ถํํ์ ๋ฐ๋ผ this ๊ฐ ๋ฌ๋ผ์ง์ง๋ง,
call, apply, bind ๋ฉ์๋์์๋ ํจ์์ this๋ฅผ ์ง์ ํ์ฌ ํธ์ถํ๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ ๋ฐฉ๋ฒ
sum(์ด ๋ถ๋ถ)
sum ํจ์ ํธ์ถ ์ ( ) ์์ ์ธ์๋ฅผ ์ ๋ฌํด ํธ์ถํ๋ค.
function sum(){
return a+b
}
sum(2,3)
call
ํจ์๋ฅผ ๋ฐ๋ก ์คํ
์คํํ ๋๋ง๋ค ๊ฐ์ฒด์ this๊ฐ์ ๋ฐ๊พธ๋ (context๋ฐ๊พธ๋) ๋ฉ์๋
๋ชจ๋ ํจ์๋ call์ด๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ (ํจ์๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ )
A. call ( "this ๋ก ์ง์ ํ ๊ฒ", "ํ๋ผ๋ฏธํฐ์ธ์๊ฐ")
sum.call( this ๋์ฒด ๊ฐ , ์ธ์)
sum.call('kim')
์์ 1)
var kim = {name: 'kim', first:10, second:20}
var lee = {name: 'lee', first:10, second:10}
function sum(){
return this.first + this.second;
}
//sum ์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ์คํ์ํค๋
// sum.call( )
sum.call(kim); //this=kim 30
sum์ด๋ผ๋ function์ kim์ด๋ผ๋ ๊ฐ์ฒด์ ๋ฉค๋ฒ๊ฐ ์๋์์ง๋ง
ํจ์๋ฅผ ํธ์ถํ ๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก sum์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ this์ ๊ฐ์ kim์ผ๋ก ์ง์ ํ๋
sum์ด๋ผ๋ ํจ์๋ Kim์ ๋ฉค๋ฒ์ธ ๋ฉ์๋๊ฐ ๋จ
์์ 2)
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
console.log(new Food('cheese', 5).name);
//"cheese"
Food ์์
Product์ this ๋ Food ์ this ์ผ! ๋ผ๊ณ ์ ์ธ
bind
ํจ์์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ this๋ฅผ ์๊ตฌ์ ์ผ๋ก ๊ณ ์ ํ ์๋ก์ด ํจ์ ์์ฑ
A.bind("๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ this", "์ธ์๊ฐ")
sum. bind ( | sum์ this ๋ก ์๊ตฌํ ์ง์ ํ ๊ฒ | sum์ ํ๋ผ๋ฏธํฐ ์ธ์๊ฐ ) |
sum.bind( | kim | ) |
var kim = {name: 'kim', first:10, second:20}
var lee = {name: 'lee', first:10, second:10}
function sum(prefix){
return prefix +(this.first + this.second);
}
var kimSum = sum.bind(kim,"->");
console.log(kimSum()); // -> 30
sum์ด ๋ฐ๋๊ฒ X
์๋ก์ด ํจ์ (kimSum) ๋ก ๋ฐ๋์ด ์์ฑ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ sum (์๋ ํจ์)์ ์ํฅ์ ์ฃผ์ง ์์
๐ง ์๊ฐํด๋ณผ ๊ฒ
call | bind | |
๊ณตํต์ | this๋ฅผ ์ง์ ํ์ฌ ํจ์๋ฅผ ํธ์ถ | |
์ฐจ์ด์ | ํจ์ ํธ์ถ | ํจ์ ์์ฑ |
์คํํ ๋๋ง๋ค ๊ฐ์ฒด์ this ๊ฐ์ ๋ฐ๊พธ๋ ๋ฉ์๋ |
์๊ตฌ์ ์ผ๋ก this ๊ฐ์ ๊ณ ์ ์ํจ ์๋ก์ด ํจ์๋ฅผ ์์ฑํ๋ ๋ฉ์๋ |
javascript์์ ํจ์๋ ์ด๋ค ์กด์ฌ์ธ๊ฐ
ํจ์๋ฅผ ํธ์ถํ ๋ new๋ฅผ ๋ถ์ด๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ฑ์๊ฐ ๋จ
ํน์ ํ ๊ฐ์ฒด๋ class ์ ์ข ์๋์ง ์๊ณ ํ์์ ๋ฐ๋ผ ์ด๋ค ๊ฐ์ฒด์ ๋ฉ์๋๋ ๋ ์๋ ์๋ ๊ฒ
์์ extends
ES5 : Object.create
ES6 : extends
๊ฐ์ฒด์์ call ๋ก ์์(extend) ๋ง๋ค์ด ๋ณด๊ธฐ
function Car(brand) {
this.carname = brand;
}
Car.prototype.present = function() {
return 'I have a ' + this.carname;
}
//Model์์ฑ์์ prototype์ show ๋ฉ์๋ ์ถ๊ฐ.
function Model(brand, mod) {
Car.call(this,brand);
this.model = mod;
}
//extends ์ญํ
Model.prototype = Object.create(Car.prototype);
Model.prototype.show = function() {
//debugger;
return this.present() + ', it is a ' + this.model;
}
//ํธ์ถ!!
const mycar = new Model("Ford", "Mustang");
mycar.show(); // "I have a Ford, it is a Mustang"
function Model(brand, mod) {
Car.call(this,brand);
this.model = mod;
}
this
Car์ ๊ฐ์ฒด๋ฅผ ๋ด ๊ฒ(Model )๊ฑธ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ
Model.prototype = Object.create(Car.prototype);
const mycar = new Model("Ford", "Mustang");
Model ์ function์ด์ง๋ง new Model ๋ก ๋ถ๋ฅด๋ฉด ์์ฑ์๊ฐ ๋จ
๋ฐ๋ผ์ Model ์ ์์ฑ์
๊ทธ๋ฐ๊ฒ mycar์ ๋ณด๋ฉด Car ์ constructor์
Object.create๋ฅผ ํ๊ธฐ ๋๋ฌธ
์ฐธ๊ณ ํ ์๋ฃ
medium.com/@lyslg1018/javascript-call-apply-bind-f6768af01a52
'๐ JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript ] prototype vs __proto__ + ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (0) | 2021.03.11 |
---|---|
[Javascript] __proto__ ์ ์์ (0) | 2021.03.11 |
JavaScript ํ๋กํ ํ์ (prototype) ์ดํด (0) | 2021.03.10 |
[JavaScript] Class ์ ์์ (0) | 2021.03.10 |
[์๋ฐ์คํฌ๋ฆฝํธ] fetch() API ํจ์๋ก ํธ์ถํ๊ธฐ (4) | 2021.02.26 |
๋๊ธ