21.09.22 TL. js - ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ
- -
๐ Object ์์ฑ์ ํจ์
์์ฑ์ ํจ์๋ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๋งํ๋ค. Object ์ธ์๋ String, Number, Boolean, Function, Array, Date, RegExp, Promise ๋ฑ์ ๋นํธ์ธ ์์ฑ์ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
Object๋ก ๋น ๊ฐ์ฒด๋ฅผ ์์ฑ ํ, ํ๋กํผํฐ ๋๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
const person = new Object();
person.name = 'Kim';
person.sayHello = () => {
console.log('Hi My name is ' + this.name);
};
Object ์์ฑ์ ํจ์๋ฅผ ์ด์ฉํ ๊ฒ๋ณด๋ค๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ํธ์ด ๋ ๊ฐํธํ๋ค.
๐ ์์ฑ์ ํจ์
๐ฅฅ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ํ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ๋ฌธ์ ์
๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ด์ฉํ ๊ฐ์ฒด ์์ฑ์ ์ง๊ด์ ์ด๊ณ ๊ฐํธํ์ง๋ง, ํ๋์ ๊ฐ์ฒด๋ง ์์ฑํ๋ค. ๋ฐ๋ผ์ ๋์ผํ ํ๋กํผํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ, ๋งค๋ฒ ๊ฐ์ ๋ด์ฉ์ ๊ธฐ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค.
๐ฅฅ ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ์ฅ์
ํ ํ๋ฆฟ์ ์ด์ฉํด ๋์ผํ ํ๋กํผํฐ ๊ตฌ์กฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
function Circle(radius) {
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getDiameter());
console.log(circle2.getDiameter());
- this๋ ๊ฐ์ฒด ์์ ์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ ์๊ธฐ ์ฐธ์กฐ ๋ณ์๋ค. this ๋ฐ์ธ๋ฉ(this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ)์ ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
- ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ → ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ๋ฉ์๋๋ก์ ํธ์ถ → ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด(.์์ ๊ฐ์ฒด) ex) person.height์ person
- ์์ฑ์ ํจ์๋ก์ ํธ์ถ → ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค
์ด ๋ new๋ฅผ ๋ถ์ด์ง ์๋๋ค๋ฉด ์์ฑ์ ํจ์๊ฐ ์๋๋ผ ์ผ๋ฐ ํจ์๋ก ๋์ํ๋ค.
const circle3 = Circle(15);
// ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋ Circle์ ๋ฐํ๋ฌธ์ด ์๊ธฐ ๋๋ฌธ์ ์๋ฌต์ ์ผ๋ก undefined๋ฅผ ๋ฐํํ๋ค.
console.log(circle3); // undefined
// ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋ Circle ๋ด์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
console.log(radius); // 15
๐ฅฅ ์์ฑ์ ํจ์์ ์ธ์คํด์ค ์์ฑ ๊ณผ์
new๋ฅผ ํตํด ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด js ์์ง์ ๋ค์๊ณผ ๊ฐ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ ํ ์๋ฌต์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
- ์ธ์คํด์ค ์์ฑ๊ณผ this ๋ฐ์ธ๋ฉ
์๋ฌต์ ์ผ๋ก ๋น ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ this์ ๋ฐ์ธ๋ฉ๋๋ค. ์ด ์ฒ๋ฆฌ๋ ๋ฐํ์ ์ด์ ์ ์คํ๋๋ค.
- ๋ฐ์ธ๋ฉ : ์๋ณ์์ ๊ฐ์ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค. this๋ ํค์๋๋ก ๋ถ๋ฅ๋์ง๋ง ์๋ณ์ ์ญํ ์ ํ๋ค.
- ์ธ์คํด์ค ์ด๊ธฐํ
๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด ๋ด์ ๊ธฐ์ ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก this์ ๋ฐ์ธ๋ฉ๋ผ ์๋ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ๋ค.
- ์ธ์คํด์ค ๋ฐํ
์์ฑ์ ํจ์ ๋ด๋ถ์ ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์์ฑ๋ ์ธ์คํด์ค๊ฐ ๋ฐ์ธ๋ฉ๋ this๊ฐ ์๋ฌต์ ์ผ๋ก ๋ฐํ๋๋ค. ๋ง์ฝ this๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฐํํ๋ฉด this๊ฐ ๋ฐํ๋์ง ๋ชปํ๊ณ return ๋ฌธ์ ๋ช ์๋ ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
function Circle(radius) {
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
return {};
}
const circle = new Circle(1);
console.log(circle); // {}
ํ์ง๋ง ๋ช ์์ ์ผ๋ก ์์ ๊ฐ์ ๋ฐํํ๋ฉด ์๋ฌต์ ์ผ๋ก this๊ฐ ๋ฐํ๋๋ค.
function Circle(radius) {
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
return 100;
}
const circle = new Circle(1);
console.log(circle); // Circle {radius: 1, getDiameter: f}
๐ฅฅ ๋ด๋ถ ๋ฉ์๋ [[Call]]๊ณผ [[Construct]]
ํจ์๋ ์ผ๋ฐ ํน์ ์์ฑ์ ํจ์๋ก ํธ์ถํ ์ ์๋ค. ํจ์๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ผ๋ฐ ๊ฐ์ฒด์ ๋์ผํ๊ฒ ๋์ํ ์ ์๋ค. ํจ์ ๊ฐ์ฒด๋ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
function foo() {}
foo.prop = 10;
foo.method = function () {
console.log(this.prop);
}
foo.method();
์ฐจ์ด์ ๋ ์๋ค. ์ผ๋ฐ ๊ฐ์ฒด๋ ํธ์ถํ ์ ์์ง๋ง ํจ์๋ ํธ์ถํ ์ ์๋ค. ๋ฐ๋ผ์ ํจ์ ๊ฐ์ฒด๋ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ๊ฐ๊ณ ์๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ฅผ ํฌํจํด ํจ์ ๊ฐ์ฒด๋ง์ ์ํ [[Environment]], [[FormalParameters]] ๋ฑ์ ๋ด๋ถ ์ฌ๋กฏ๊ณผ [[Call]], [[Construct]] ๊ฐ์ ๋ด๋ถ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ๊ฐ์ง๊ณ ์๋ค.
ํจ์๊ฐ ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋๋ฉด ๋ด๋ถ ๋ฉ์๋[[Call]]์ด ํธ์ถ๋๊ณ new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋๋ฉด ๋ด๋ถ ๋ฉ์๋ [[Construct]]๊ฐ ํธ์ถ๋๋ค.
[[Call]]์ ๊ฐ๋ ํจ์ ๊ฐ์ฒด๋ฅผ collable์ด๋ผ ํ๋ฉฐ, [[Construct]]๋ฅผ ๊ฐ๋ ํจ์ ๊ฐ์ฒด๋ฅผ constructor๋ผ๊ณ ํ๋ค.
๋ชจ๋ ํจ์๋ callable์ด์ง๋ง constructor๋ ์๋ ์๋ ์๋ค. ์ฆ, ๋ชจ๋ ํจ์ ๊ฐ์ฒด๋ ํธ์ถํ ์ ์์ง๋ง ๋ชจ๋ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑ์ ํจ์๋ก์ ํธ์ถํ ์ ์๋ ๊ฒ์ ์๋๋ค.
๐ฅฅ constructor์ non-constructor์ ๊ตฌ๋ถ
js ์์ง์ ํจ์ ์ ์๋ฅผ ํ๊ฐํด์ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํจ์ ์ ์ ๋ฐฉ์์ ๋ฐ๋ผ constructor์ non-constructor๋ก ๊ตฌ๋ถํ๋ค.
- constructor : ํจ์ ์ ์ธ๋ฌธ, ํจ์ ํํ์, ํด๋์ค
- ํด๋์ค๋ ํจ์๋ค.
- non-constructor : ๋ฉ์๋, ํ์ดํ ํจ์
- ECMAScript์์์ ๋ฉ์๋๋ ES6์ ๋ฉ์๋ ์ถ์ฝ ํํ๋ง์ ์๋ฏธํ๋ค.
function foo() {} const bar = function () {}; // ํ๋กํผํฐ x์ ๊ฐ์ผ๋ก ํ ๋น๋ ๊ฒ์ ์ผ๋ฐ ํจ์๋ก ์ ์๋ ํจ์๋ค. ์ฆ, ๋ฉ์๋๊ฐ ์๋๋ค. const baz = { x: function () {} }; new foo(); // foo {} new bar(); // bar {} new baz.x(); // x {} const arrow = () => {}; new arrow(); // TypeError: arrow is not a constructor // ๋ฉ์๋ ์ ์: ES6์ ๋ฉ์๋ ์ถ์ฝ ํํ๋ง ๋ฉ์๋๋ก ์ธ์ ํ๋ค. const obj = { x() {} }; new obj.x();โ
- ECMAScript์์์ ๋ฉ์๋๋ ES6์ ๋ฉ์๋ ์ถ์ฝ ํํ๋ง์ ์๋ฏธํ๋ค.
๐ฅฅ new.target
ES6์์๋ ์์ฑ์ ํจ์ new ์ฐ์ฐ์ ์์ด ํธ์ถ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด new.tartget์ ์ง์ํ๋ค.
new.target์ this์ ์ ์ฌํ๊ฒ constructor์ธ ๋ชจ๋ ํจ์ ๋ด๋ถ์์ ์๋ฌต์ ์ธ ์ง์ญ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋๋ฉฐ ๋ฉํ ํ๋กํผํฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํจ์ ๋ด๋ถ์์ new.target์ ์ฌ์ฉํ๋ฉด new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋์๋์ง ํ์ธํ ์ ์๋ค. new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋๋ฉด ํจ์ ๋ด๋ถ์ new.target์ ํจ์ ์์ ์ ๊ฐ๋ฆฌํจ๋ค. new ์ฐ์ฐ์ ์์ด ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋ ๋ด๋ถ์ new.target์ undefined๋ค.
function Circle(radius) {
// new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋์ง ์์๋ค๋ฉด new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ฅผ
// ์ฌ๊ท ํธ์ถํ์ฌ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
if (!new.target) {
return new Circle(radius);
}
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
// new ์ฐ์ฐ์ ์์ด ์์ฑ์ ํจ์๋ฅผ ํธ์ถํด๋ new.target์ ํตํด ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋๋ค.
const circle = Circle(5);
console.log(circle.getDiameter());
๋ง์ฝ ES6๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํฉ์ด๋ผ๋ฉด ์ค์ฝํ ์ธ์ดํ ์์ฑ์ ํจํด์ ์ฌ์ฉํ ์ ์๋ค.
// if(!new.target)
if (!(this instanceof Circle))
๋๋ถ๋ถ์ ๋นํธ์ธ ํจ์๋ค์ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋์๋์ง ํ์ธ ํ ์ ์ ํ ๊ฐ์ ๋ฐํํ๋ค. ๊ทธ๋ฌ๋ String, Number, Boolean ์์ฑ์ ํจ์๋ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด String, Number. Boolean ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฐํํ์ง๋ง, new ์ฐ์ฐ์ ์์ด๋ ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํ๋ค. ์ด ๊ฐ์ ํน์ฑ์ ๋ฐ์ดํฐ ํ์ ๋ณํ์๋ ์ด์ฉ๋๋ค.
let obj = new Object();
console.log(obj); // {}
obj = Object();
console.log(obj); // {}
const str = String(123);
console.log(str, typof str) // 123 string
'TL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
03/09 TL. SOLID 5์์น(ts) (0) | 2022.03.10 |
---|---|
21/09/17 TL. ์๋ฐ์คํฌ๋ฆฝํธ - ํจ์(2), ์ค์ฝํ (0) | 2021.09.18 |
21/09/13 TL. ์ปดํจํฐ ์์คํ ์ ๊ตฌ์กฐ (0) | 2021.09.14 |
21/09/12 TL. ์๋ฐ์คํฌ๋ฆฝํธ - ํจ์(1) (0) | 2021.09.12 |
21/09/11 TL. ๊ฐ์ฒด ๋ฆฌํฐ๋ด, ์์ ๊ฐ๊ณผ ๊ฐ์ฒด์ ๋น๊ต (0) | 2021.09.12 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค