-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1028 from Ryan-Dia/ryan-dia
25-1μ₯ ν΄λμ€ - κ°μ² μ
- Loading branch information
Showing
1 changed file
with
260 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,260 @@ | ||
**TIL(Today I learn) κΈ°λ‘μΌ** : 2023.12.20 | ||
|
||
# 25. π₯ ν΄λμ€ | ||
|
||
<br> | ||
|
||
## π λͺ©μ°¨ | ||
|
||
[1. ν΄λμ€λ νλ‘ν νμ μ λ¬Έλ²μ μ€νμΈκ°?](#1-ν΄λμ€λ-νλ‘ν νμ μ-λ¬Έλ²μ -μ€νμΈκ°) | ||
[2. ν΄λμ€ μ μ](#2-ν΄λμ€-μ μ) | ||
[3. ν΄λμ€](#3-ν΄λμ€) | ||
[4. μΈμ€ν΄μ€ μμ±](#4-μΈμ€ν΄μ€-μμ±) | ||
[5. λ©μλ](#5-λ©μλ) | ||
|
||
|
||
|
||
--- | ||
|
||
<br> | ||
|
||
## 1. ν΄λμ€λ νλ‘ν νμ μ λ¬Έλ²μ μ€νμΈκ°? | ||
|
||
β μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄μ λλ€.(λΉλ‘ λ€λ₯Έ κ°μ²΄μ§ν₯ μΈμ΄μμ μ°¨μ΄μ μ λν λ Όμμ΄ μκΈ΄ νμ§λ§ μλ°μ€ν¬λ¦½νΈλ κ°λ ₯ν κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° λ₯λ ₯μ μ§λκ³ μμ΅λλ€. | ||
|
||
νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄λ ν΄λμ€κ° νμ μλ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄μ λλ€. ES5μμλ ν΄λμ€ μμ΄λ λ€μκ³Ό κ°μ΄ μμ±μ ν¨μμ νλ‘ν νμ μ ν΅ν΄ κ°μ²΄μ§ν₯ μΈμ΄μ μμμ ꡬνν μ μμ΅λλ€. | ||
|
||
```js | ||
function Person(name) { | ||
this.name = name; | ||
} | ||
|
||
Person.prototype.sayHi = function () { | ||
console.log(`Hi, I'm ${this.name}`); | ||
}; | ||
|
||
const me = new Person('J'); | ||
me.sayHi(); // "Hi, I'm J" | ||
``` | ||
|
||
- class λ¬Έλ²μ κΈ°μ‘΄ νλ‘ν νμ κΈ°λ° ν¨ν΄μ ν΄λμ€ κΈ°λ° ν¨ν΄μ²λΌ μ¬μ©ν μ μλλ‘ νλ ν¨μ(λ¬Έλ²μ μ€ν)μ λλ€. | ||
- ν΄λμ€μ μμ±μ ν¨μλ λͺ¨λ νλ‘ν νμ κΈ°λ°μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§λ§, μ νν λμΌνκ² λμνμ§ μμ΅λλ€. | ||
- ν΄λμ€λ μμ±μ ν¨μλ³΄λ€ μ격νλ©° μμ±μ ν¨μμμ μ 곡νμ§ μλ κΈ°λ₯λ μ 곡ν©λλ€. | ||
|
||
βοΈ ν΄λμ€μ μμ±μ ν¨μμ μ°¨μ΄μ | ||
- ν΄λμ€λ λ°λμ new μ°μ°μμ ν¨κ» νΈμΆν΄μΌ νμ§λ§, μμ±μ ν¨μλ new μ°μ°μκ° μμ΄λ μΌλ° ν¨μλ‘μ νΈμΆλ©λλ€. | ||
- μμ±μ ν¨μμ λ¬λ¦¬ ν΄λμ€λ μμμ μ§μνλ extendsμ super ν€μλλ₯Ό μ 곡ν©λλ€. | ||
- μμ±μ ν¨μμ λ¬λ¦¬ ν΄λμ€λ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ λμν©λλ€. | ||
- μμ±μ ν¨μμ λ¬λ¦¬ ν΄λμ€λ λ΄λΆ μ½λμμ μ묡μ μΌλ‘ strict modeκ° μ€νλ©λλ€. | ||
- ν΄λμ€μ constructor, νλ‘ν νμ λ©μλ, μ μ λ©μλλ λͺ¨λ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ [[Enumerable]] μ΄ falseμ΄κΈ°μ μ΄κ±°λμ§ μμ΅λλ€. | ||
|
||
<br> | ||
|
||
--- | ||
|
||
## 2. ν΄λμ€ μ μ | ||
|
||
ν΄λμ€λ `class` ν€μλλ₯Ό μ¬μ©νμ¬ μ μν©λλ€. | ||
ν΄λμ€ μ΄λ¦μ μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ νμ€μΉΌ μΌμ΄μ€λ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μ λλ€. | ||
|
||
```js | ||
// μ΅λͺ ν΄λμ€ ννμ | ||
const Person = class {}; | ||
|
||
// κΈ°λͺ ν΄λμ€ ννμ | ||
const Person = class MyClass {}; | ||
``` | ||
|
||
π ν΄λμ€λ μΌκΈ κ°μ²΄λ‘μ λ€μκ³Ό κ°μ νΉμ§μ κ°μ΅λλ€. | ||
- 무λͺ μ 리ν°λ΄λ‘ μμ±ν μ μλ€. μ¦, λ°νμμ μμ±μ΄ κ°λ₯ν©λλ€. | ||
- λ³μλ μλ£κ΅¬μ‘°(κ°μ²΄, λ°°μ΄ λ±)μ μ μ₯ν μ μμ΅λλ€. | ||
- ν¨μμ 맀κ°λ³μμκ² μ λ¬ν μ μμ΅λλ€. | ||
- ν¨μμ λ°νκ°μΌλ‘ μ¬μ©ν μ μμ΅λλ€. | ||
|
||
λͺΈμ²΄μλ λ©μλ (`constructor`, νλ‘ν νμ λ©μλ, μ μ λ©μλ)λ§ μ μν μ μμ΅λλ€. | ||
|
||
```js | ||
class Person { | ||
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν | ||
constructor(name) { | ||
this.name = name; // public | ||
} | ||
|
||
// νλ‘ν νμ λ©μλ | ||
sayHi() { | ||
console.log(`Hi I'm ${this.name}`); | ||
} | ||
|
||
// μ μ λ©μλ | ||
static sayHello() { | ||
console.log(`Hi I'm ${this.name}`); | ||
} | ||
} | ||
|
||
const me = new Person('J'); | ||
me.sayHi(); // // "Hi I'm J" | ||
Person.sayHello(); // "Hi I'm Person" | ||
``` | ||
|
||
<br> | ||
|
||
--- | ||
|
||
## 3. ν΄λμ€ νΈμ΄μ€ν | ||
|
||
ν΄λμ€ μ μΈλ¬ΈμΌλ‘ μ μν ν΄λμ€λ ν¨μ μ μΈλ¬Έκ³Ό κ°μ΄ λ°νμ μ΄μ μ λ¨Όμ νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±ν©λλ€. | ||
μ΄λ ν¨μ κ°μ²΄λ `constructor`μ΄κ³ μμ±μ ν¨μμ ν¨κ» νλ‘ν νμ λ μμ±λ©λλ€. | ||
|
||
```js | ||
class Person {} | ||
|
||
console.log(typeof Person); // function | ||
``` | ||
|
||
>ν΄λμ€ μ μ μ΄μ μ μ°Έμ‘°ν μ μμ΄ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ² μ²λΌ λμν©λλ€. | ||
```js | ||
const Person = ''; | ||
|
||
{ | ||
console.log(Person); // error | ||
class Person {} | ||
} | ||
``` | ||
|
||
β λͺ¨λ μ μΈλ¬Έμ λ°νμ μ΄μ μ μ€νλ©λλ€. | ||
|
||
<br> | ||
|
||
--- | ||
|
||
## 4. μΈμ€ν΄μ€ μμ± | ||
|
||
>ν΄λμ€λ μμ±μ ν¨μμ΄λ©° new μ°μ°μμ ν¨κ» νΈμΆλμ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. | ||
```js | ||
class Person {} | ||
|
||
// μΈμ€ν΄μ€ μμ± | ||
const me = new Person(); | ||
console.log(me); // Person {} | ||
``` | ||
|
||
>ν¨μλ newμ°μ°μμ μ¬μ© μ¬λΆμ λ°λΌ μΌλ° ν¨μλ‘ νΈμΆλκ±°λ μΈμ€ν΄μ€ μμ±μ μν μμ±μ ν¨μλ‘ νΈμΆλμ§λ§ ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ΄ μ μΌν μ‘΄μ¬ μ΄μ μ΄λ―λ‘ λ°λμ new μ°μ°μμ ν¨κ» νΈμΆν΄μΌ ν©λλ€. | ||
```js | ||
class Person {} | ||
// ν΄λμ€λ₯Ό new μ°μ°μ μμ΄ νΈμΆνλ©΄ νμ μλ¬κ° λ°μνλ€. | ||
const me = Person(); | ||
// TypeError: Class constructor Person cannot be invoked without 'new' | ||
``` | ||
<br> | ||
|
||
--- | ||
|
||
## 5. λ©μλ | ||
|
||
### 1) constructor | ||
|
||
- μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ΄κΈ°ννκΈ° μν νΉμν λ©μλλ‘ μ΄λ¦μ λ³κ²½ν μ μμ΅λλ€. | ||
- λ΄λΆμ `this`λ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν΅λλ€. | ||
- `this`μ μΆκ°ν νλ‘νΌν°λ μΈμ€ν΄μ€ νλ‘νΌν°κ° λ©λλ€. | ||
|
||
```js | ||
class Person { | ||
constructor(name) { | ||
this.name = name; | ||
this.city = 'seoul'; | ||
} | ||
} | ||
|
||
const me = new Person('J'); | ||
console.log(me); // Person {name: 'J', city: 'seoul'} | ||
``` | ||
|
||
- λ¨μν λ©μλλ‘ ν΄μλμ§ μκ³ , ν΄λμ€κ° νκ°λμ΄ μμ±ν ν¨μ κ°μ²΄ μ½λμ μΌλΆκ° λ©λλ€. | ||
- ν κ°λ§ μ‘΄μ¬ν μ μμ΅λλ€. | ||
- μλ΅μ΄ κ°λ₯ν©λλ€. | ||
```js | ||
class Person {} // μλμ²λΌ λΉ constructorκ° μ묡μ μΌλ‘ μ μλ¨ | ||
|
||
class Person { | ||
constructor() {} | ||
} | ||
``` | ||
- λ³λμ λ°νλ¬Έμ κ°μ§ μμμΌ ν©λλ€. | ||
|
||
### 2) νλ‘ν νμ λ©μλ | ||
|
||
- ν΄λμ€μμ μ μν λ©μλλ κΈ°λ³Έμ μΌλ‘ νλ‘ν νμ λ©μλμ λλ€. | ||
- ν΄λμ€μ μΈμ€ν΄μ€λ νλ‘ν νμ 체μΈμ μΌμμ λλ€. | ||
|
||
```js | ||
class Person { | ||
constructor(name) { | ||
this.name = name; | ||
} | ||
|
||
sayHi() { | ||
console.log(`Hi, I'm ${this.name}`); | ||
} | ||
} | ||
|
||
const me = new Person('J'); | ||
|
||
console.log(Object.getPrototypeOf(me) === Person.prototype); // true | ||
console.log(me instanceof Person); // true | ||
|
||
console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype); // true | ||
console.log(me instanceof Object); // true | ||
|
||
console.log(me.constructor === Person); // true | ||
``` | ||
|
||
### 3) μ μ λ©μλ | ||
|
||
μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ νΈμΆν μ μλ λ©μλμ λλ€. | ||
|
||
- ν΄λμ€λ ν¨μ κ°μ²΄μ΄λ―λ‘ μμ μ νλ‘νΌν°/λ©μλλ₯Ό μμ ν μ μκΈ°μ, ν΄λμ€ μ μκ° νκ°λ ν μ μ λ©μλλ₯Ό νΈμΆν μ μμ΅λλ€. | ||
- μΈμ€ν΄μ€μ νλ‘ν νμ 체μΈμ ν΄λμ€κ° μ‘΄μ¬νμ§ μμΌλ―λ‘, μΈμ€ν΄μ€λ ν΄λμ€μ λ©μλλ₯Ό μμλ°μ μ μμ΅λλ€. | ||
|
||
```js | ||
class Person { | ||
constructor(name) { | ||
this.name = name; | ||
} | ||
|
||
static sayHi() { | ||
console.log('Hi'); | ||
} | ||
} | ||
|
||
Person.sayHi(); // Hi | ||
``` | ||
|
||
### 4) μ μ λ©μλμ νλ‘ν νμ λ©μλμ μ°¨μ΄ | ||
|
||
>μ μ λ©μλμ νλ‘ν νμ λ©μλμ μ°¨μ΄λ λ€μκ³Ό κ°μ΅λλ€. | ||
- μ μ λ©μλμ νλ‘ν νμ λ©μλλ μμ μ΄ μν΄ μλ νλ‘ν νμ 체μΈμ΄ λ€λ₯΄λ€. | ||
- μ μ λ©μλλ ν΄λμ€λ‘ νΈμΆνκ³ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆνλ€. | ||
- μ μ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν μ μμ§λ§ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν μ μλ€. | ||
|
||
β νμ€ λΉνΈμΈ κ°μ²΄μΈ Math, Number, JSON, Object, Reflect λ±μ λ€μν μ μ λ©μλλ₯Ό κ°μ§κ³ μμ΅λλ€. μ΄λ¬ν μ μ λ©μλλ μ ν리μΌμ΄μ μ μμμ μ¬μ©ν μ νΈλ¦¬ν° ν¨μμ λλ€. | ||
|
||
```js | ||
// νμ€ λΉνΈμΈ κ°μ²΄μ μ μ λ©μλ | ||
Math.max(1, 2, 3); // -> 3 | ||
Number.isNaN(NaN); // -> true | ||
JSON.stringify({ a: 1 }); // -> "{"a":1}" | ||
Object.is({}, {}); // -> false | ||
Reflect.has({ a: 1 }, 'a'); // -> true | ||
``` | ||
|
||
### 5) ν΄λμ€μμ μ μν λ©μλμ νΉμ§ | ||
|
||
>ν΄λμ€μμ μ μν λ©μλλ λ€μκ³Ό κ°μ νΉμ§μ κ°μ΅λλ€. | ||
1. `function` ν€μλλ₯Ό μλ΅ν λ©μλ μΆμ½ ννμ μ¬μ©νλ€. | ||
2. κ°μ²΄ 리ν°λ΄κ³Όλ λ€λ₯΄κ² ν΄λμ€μ λ©μλλ₯Ό μ μν λλ μ½€λ§κ° νμμλ€. | ||
3. μ묡μ μΌλ‘ `strict mode`λ‘ μ€νλλ€. | ||
4. `for...in` λ¬Έμ΄λ `Object.keys` λ©μλ λ±μΌλ‘ μ΄κ±°ν μ μλ€. μ¦ νλ‘νΌν°μ μ΄κ±° κ°λ₯ μ¬λΆλ₯Ό λνλ΄λ©°, λΆλ¦¬μΈ κ°μ κ°λ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ `[[Enumerable]]`μ κ°μ΄ `false`λ€. | ||
5. λ΄λΆ λ©μλ `[[Construct]]`λ₯Ό κ°μ§ μλ `non-constructor`λ€. λ°λΌμ `new` μ°μ°μμ ν¨κ» νΈμΆν μ μλ€. | ||
|
||
|