ν‹°μŠ€ν† λ¦¬ λ·°

λ“±μž₯ λ°°κ²½

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ μ–Έμ–΄λ‘œ ν΄λž˜μŠ€κ°€ ν•„μš” μ—†λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μž…λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ 클래슀 기반 언어에 μ΅μˆ™ν•œ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ ν”„λ‘œν† νƒ€μž… 기반 ν”„λ‘œκ·Έλž˜λ° 방식에 ν˜Όλž€μ„ λŠλ‚„ 수 있으며 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ–΄λ ΅κ²Œ 느끼게 ν•˜λŠ” ν•˜λ‚˜μ˜ μž₯벽처럼 μΈμ‹λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ ES6μ—μ„œ λ„μž…λœ ν΄λž˜μŠ€λŠ” κΈ°μ‘΄ ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°λ³΄λ‹€ 클래슀 기반 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° 언어와 맀우 ν‘μ‚¬ν•œ μƒˆλ‘œμš΄ 객체 생성 λ©”μ»€λ‹ˆμ¦˜μ„ μ œμ‹œν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

사싀 ν΄λž˜μŠ€λŠ” ν•¨μˆ˜μ΄λ©° κΈ°μ‘΄ ν”„λ‘œν† νƒ€μž… 기반 νŒ¨ν„΄μ„ 클래슀 기반 νŒ¨ν„΄μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” 문법적 섀탕이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, μƒμ„±μž ν•¨μˆ˜μ™€ 맀우 μœ μ‚¬ν•˜κ²Œ λ™μž‘ν•˜λŠ” 반면 λͺ‡ 가지 차이점이 μžˆμ–΄ μƒˆλ‘œμš΄ 객체 생성 λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ λ³΄λŠ” 것이 μ’€ 더 ν•©λ‹Ήν•©λ‹ˆλ‹€.

 

클래슀 μƒμ„±μž ν•¨μˆ˜
new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬κ°€ 남 new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λ©΄ 일반 ν•¨μˆ˜λ‘œμ„œ 호좜됨
상속을 μ§€μ›ν•˜λŠ” extends와 super ν‚€μ›Œλ“œλ₯Ό 제곡  extends와 super ν‚€μ›Œλ“œλ₯Ό 제곡 X
ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ ν•¨μˆ˜ μ„ μ–Έλ¬Έ/ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•˜λ©΄ ν˜Έμ΄μŠ€νŒ… λ°œμƒ
μ•”λ¬΅μ μœΌλ‘œ strict modeκ°€ 지정됨(ν•΄μ œ λΆˆκ°€λŠ₯) μ•”λ¬΅μ μœΌλ‘œ strict mode 지정 X
constructor, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œλŠ” μ—΄κ±° X μ—΄κ±° κ°€λŠ₯

 

이처럼 ν΄λž˜μŠ€λŠ” μƒμ„±μž ν•¨μˆ˜ 기반의 객체 생성 방식보닀 κ²¬κ³ ν•˜κ³  λͺ…λ£Œν•©λ‹ˆλ‹€. 특히 extends와 super ν‚€μ›Œλ“œλŠ” 상속 관계 κ΅¬ν˜„μ„ λ”μš± κ°„κ²°ν•˜κ³  λͺ…λ£Œν•˜κ²Œ ν•©λ‹ˆλ‹€.


클래슀 μ •μ˜

ν΄λž˜μŠ€λŠ” class ν‚€μ›Œλ“œλ₯Ό 톡해 μ •μ˜ν•©λ‹ˆλ‹€. 

 

// 클래슀 μ„ μ–Έλ¬Έ
class Person {};

// 읡λͺ… 클래슀 ν‘œν˜„μ‹
const Person = class {};

// κΈ°λͺ… 클래슀 ν‘œν˜„μ‹
const Person = class MyClass {};

 

μΌλ°˜μ μ΄μ§€λŠ” μ•Šμ§€λ§Œ ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν‘œν˜„μ‹μœΌλ‘œ 클래슀λ₯Ό μ •μ˜ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 즉, ν΄λž˜μŠ€κ°€ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” *일급 κ°μ²΄λΌλŠ” 것을 μ˜λ―Έν•˜κ³  이λ₯Ό 톡해 ν΄λž˜μŠ€λŠ” ν•¨μˆ˜μΈ 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

*일급 객체의 μ˜λ―Έμ™€ νŠΉμ§•μ„ μ•Œκ³ μ‹Άλ‹€λ©΄ μ•„λž˜μ˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•˜μ„Έμš”.

https://j-su2.tistory.com/68?category=1037205 

 

[JavaScript] ν•¨μˆ˜μ™€ 일급 객체

일급 객체 일급 κ°μ²΄λž€, λ‹€μŒκ³Ό 쑰건을 λ§Œμ‘±ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 μžˆλ‹€. 즉, λŸ°νƒ€μž„μ— 생성이 κ°€λŠ₯ν•˜λ‹€. λ³€μˆ˜λ‚˜ 자료ꡬ쑰(객체, λ°°μ—΄ λ“±)에 μ €μž₯ν•  수 μžˆλ‹€. ν•¨μˆ˜μ˜ λ§€κ°œλ³€

j-su2.tistory.com

 

클래슀 λͺΈμ²΄μ—λŠ” 0개 μ΄μƒμ˜ λ©”μ„œλ“œλ§Œ μ •μ˜ν•  수 있고, μ •μ˜ν•  수 μžˆλŠ” λ©”μ„œλ“œλŠ” constructor(μƒμ„±μž), ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œ 3가지가 μžˆμŠ΅λ‹ˆλ‹€.

 

// 클래슀 μ„ μ–Έλ¬Έ
class Person {
    // μƒμ„±μž
    constructor(name) {
    	// μΈμŠ€ν„΄μŠ€ 생성 및 μ΄ˆκΈ°ν™”
        this.name = name; // name ν”„λ‘œνΌν‹°λŠ” public
    }
    
    // ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ
    sayHi() {
    	console.log(`Hi! My name is ${this.name}`);
    }
    
    // 정적 λ©”μ„œλ“œ
    static sayHello() {
    	console.log('Hello!');
    }
}

// μΈμŠ€ν„΄μŠ€ 생성
const me = new Person('Lee');

// μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° μ°Έμ‘°
console.log(me.name); // Lee
// ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ 호좜
me.sayHi(); // Hi! My name is Lee
// 정적 λ©”μ„œλ“œ 호좜
Person.sayHello(); // Hello!

 

이처럼 ν΄λž˜μŠ€μ™€ μƒμ„±μž ν•¨μˆ˜μ˜ μ •μ˜ 방식은 ν˜•νƒœμ μΈ λ©΄μ—μ„œ 맀우 μœ μ‚¬ν•©λ‹ˆλ‹€.


클래슀 ν˜Έμ΄μŠ€νŒ…

ν΄λž˜μŠ€λŠ” ν•¨μˆ˜λ‘œ ν‰κ°€λ˜κΈ° λ•Œλ¬Έμ— 클래슀 μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν΄λž˜μŠ€λŠ” ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό 같이 μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •, 즉 λŸ°νƒ€μž„ 이전에 λ¨Όμ € ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ΄λ•Œ constructor ν•¨μˆ˜κ°€ μƒμ„±λ˜κ³  ν”„λ‘œν† νƒ€μž…λ„ λ”λΆˆμ–΄ μƒμ„±λ©λ‹ˆλ‹€.

 

console.log(Person); // ReferenceError

class Person();

 

단, ν΄λž˜μŠ€λŠ” let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ²˜λŸΌ ν˜Έμ΄μŠ€νŒ… λ˜μ–΄ *μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ— 빠지기 λ•Œλ¬Έμ— ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€. λ”°λΌμ„œ ν΄λž˜μŠ€λŠ” 클래슀 μ •μ˜ 이전에 μ°Έμ‘°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

*μΌμ‹œμ  μ‚¬κ°μ§€λŒ€(DTZ) : μŠ€μ½”ν”„μ˜ μ‹œμž‘ 지점뢀터 μ΄ˆκΈ°ν™” μ§€μ κΉŒμ§€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λŠ” ꡬ간


μΈμŠ€ν„΄μŠ€ 생성

ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μœ μΌν•œ 쑴재 μ΄μœ μ΄λ―€λ‘œ λ°˜λ“œμ‹œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ–΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

 

class Person1 {};

const me = Person1(); // TypeError

λ©”μ„œλ“œ

클래슀 λͺΈμ²΄μ—μ„œ μ •μ˜ν•  수 μžˆλŠ” λ©”μ„œλ“œλŠ” constructor(μƒμ„±μž), ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œ 3가지 μž…λ‹ˆλ‹€.

 

constructor

constructorλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ„œλ“œλ‘œ 이름을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

class Person {
    // μƒμ„±μž
    constructor(name) {
    	// μΈμŠ€ν„΄μŠ€ 생성 및 μ΄ˆκΈ°ν™”
        this.name = name;
    }
}

 

ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μƒμ„±μž ν•¨μˆ˜λ‘œ ν•¨μˆ˜ 객체 고유 ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜μ™€ λ™μΌν•˜κ²Œ ν”„λ‘œν† νƒ€μž…κ³Ό μ—°κ²°λ˜μ–΄ 있으며 μžμ‹ μ˜ μŠ€μ½”ν”„μ²΄μΈμ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.

 

 

λ˜ν•œ, μƒμ„±μž ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ constructor λ‚΄λΆ€μ—μ„œ this에 μΆ”κ°€ν•œ ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°κ°€ λ©λ‹ˆλ‹€.

 

constructorλŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

  • constructorλŠ” 클래슀 내에 μ΅œλŒ€ ν•œ 개만 μ‘΄μž¬ν•  수 있음
  • constructorλŠ” μƒλž΅ν•  수 있음 (μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λ €λ©΄ constructor μƒλž΅ λΆˆκ°€λŠ₯)
  • constructorλ₯Ό μƒλž΅ν•˜λ©΄ ν΄λž˜μŠ€μ— 빈 constructorκ°€ μ•”λ¬΅μ μœΌλ‘œ μ •μ˜λ¨
  • constructorλŠ” λ³„λ„μ˜ λ°˜ν™˜λ¬Έμ„ 갖지 μ•Šμ•„μ•Ό 함 (return λ¬Έ μƒλž΅)

 

ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ

클래슀 λͺΈμ²΄μ—μ„œ μ •μ˜ν•œ λ©”μ†Œλ“œλŠ” 클래슀의 prototype ν”„λ‘œνΌν‹°μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ•„λ„ 기본적으둜 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œκ°€ λ©λ‹ˆλ‹€.  (μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ…μ‹œμ μœΌλ‘œ ν”„λ‘œν¬νƒ€μž…μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό 함)

 

class Person {
    // μƒμ„±μž
    constructor(name) {
    	// μΈμŠ€ν„΄μŠ€ 생성 및 μ΄ˆκΈ°ν™”
        this.name = name;
    }
    
    // ν”„λ‘œν¬νƒ€μž… λ©”μ„œλ“œ
    sayHi() {
    	console.log(`Hi! My name is ${this.name}`);
    }
}

const me = new Person('Lee');
me.sayHi(); // Hi! My name is Lee

// me 객체의 ν”„λ‘œν† νƒ€μž…μ€ Person.prototype
Object.getPrototypeOf(me) === Person.prototype; //true
me instanceof Person; // true

// Person.prototype의 ν”„λ‘œν† νƒ€μž…μ€ Object.prototype
Object.getPrototypeOf(Person.prototype) === Object.prototype; //true
me instanceof Object; // true

// me 객체의 constructorλŠ” Person 클래슀
me.constructor === Person; // true

 

λ”°λΌμ„œ μΈμŠ€ν„΄μŠ€λŠ” ν”„λ‘œν¬νƒ€μž… λ©”μ„œλ“œλ₯Ό 상속받아 μ‚¬μš©ν•  수 있고 μƒμ„±μž ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λŠ” ν”„λ‘œν¬νƒ€μž… 체인의 일원이 λ©λ‹ˆλ‹€.

 

 

이처럼 ν”„λ‘œν† νƒ€μž… 체인은 기쑴의 λͺ¨λ“  객체 생성 λ°©μ‹λΏλ§Œ μ•„λ‹ˆλΌ ν΄λž˜μŠ€μ— μ˜ν•΄ μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ—λ„ λ™μΌν•˜κ²Œ μ μš©λ©λ‹ˆλ‹€. κ²°κ΅­ ν΄λž˜μŠ€λŠ” μƒμ„±μž ν•¨μˆ˜μ™€ 같이 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” μƒμ„±μž ν•¨μˆ˜μ΄κ³  ν”„λ‘œν† νƒ€μž… 기반의 객체 생성 λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.

 

정적 λ©”μ„œλ“œ

정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό λ§ν•©λ‹ˆλ‹€. ν΄λž˜μŠ€μ—μ„œλŠ” λ©”μ„œλ“œμ— static ν‚€μ›Œλ“œλ₯Ό 뢙이면 정적 λ©”μ„œλ“œκ°€ λ©λ‹ˆλ‹€. ( μƒμ„±μž ν•¨μˆ˜λŠ” λͺ…μ‹œμ μœΌλ‘œ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό 함)

 

class Person {
    // μƒμ„±μž
    constructor(name) {
    	// μΈμŠ€ν„΄μŠ€ 생성 및 μ΄ˆκΈ°ν™”
        this.name = name;
    }
    
    // ν”„λ‘œν¬νƒ€μž… λ©”μ„œλ“œ
    static sayHi() {
    	console.log('Hi!');
    }
}

Person.sayHi(); // Hi!

// μΈμŠ€ν„΄μŠ€ 생성
const me = new Person('Lee');
me.sayHi(); // TypeError

 

μœ„ 예제의 Person ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같이 ν”„λ‘œν† νƒ€μž… 체인을 μƒμ„±ν•©λ‹ˆλ‹€.

 

 

이처럼 정적 λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— λ°”μΈλ”©λœ λ©”μ„œλ“œκ°€ 되기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž… 체인상에 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ‘œ ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

정적 λ©”μ„œλ“œ vs ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ

  • 정적 λ©”μ„œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μžμ‹ μ΄ 속해 μžˆλŠ” ν”„λ‘œν† νƒ€μž… 체인이 닀름
  • 정적 λ©”μ„œλ“œλŠ” 클래슀둜 ν˜ΈμΆœν•˜κ³  ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ‘œ 호좜
  • 정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° μ°Έμ‘°X, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° μ°Έμ‘°O

 

 

ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ λ©”μ„œλ“œμ˜ νŠΉμ§•

  1. function ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•œ λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μ„ μ‚¬μš©ν•¨
  2. 객체 λ¦¬ν„°λŸ΄κ³ΌλŠ” λ‹€λ₯΄κ²Œ ν΄λž˜μŠ€μ— λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•ŒλŠ” μ½€λ§ˆκ°€ ν•„μš” μ—†μŒ
  3. μ•”λ¬΅μ μœΌλ‘œ strict mode둜 싀행됨
  4. for ... in λ¬Έμ΄λ‚˜ Object.keys λ©”μ„œλ“œ λ“±μœΌλ‘œ μ—΄κ±°ν•  수 μ—†μŒ ([[Enumerable]] 은 falseμž„)
  5. λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]]λ₯Ό 갖지 μ•ŠλŠ” non-constructor이기 λ•Œλ¬Έμ— new μ—°μ‚°μžμ™€ 호좜이 λΆˆκ°€λŠ₯

클래슀의 μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

new μ—°μ‚°μžμ™€ ν•¨κ»˜ 클래슀λ₯Ό ν˜ΈμΆœν•˜λ©΄ 클래슀의 λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]]κ°€ ν˜ΈμΆœλ˜μ–΄ λ‹€μŒκ³Ό 같은 과정을 거쳐 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ©λ‹ˆλ‹€.

 

class Person {
    // μƒμ„±μž
    constructor(name) {
    	// 1. μ•”λ¬΅μ μœΌλ‘œ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³  this에 바인딩
        console.log(this); // Person {}
        console.log(Object.getPrototypeOf(this) === Person.prototype); // true
        
        // 2. this에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”
        this.name = name;
    }
    
    // 3. μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ thisκ°€ μ•”λ¬΅μ €κΈλ‘œ λ°˜ν™˜λ¨
}

 

1. μΈμŠ€ν„΄μŠ€ 생성과 this 바인딩

  • new μ—°μ‚°μžμ™€ ν•¨κ»˜ 클래슀λ₯Ό ν˜ΈμΆœν•˜λ©΄ constructor λ‚΄λΆ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ°μ— μ•žμ„œ μ•”λ¬΅μ μœΌλ‘œ 빈 객체가 생성됨
  • ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ 클래슀의 prototype ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” 객체가 섀정됨
  • 빈 객체(μΈμŠ€ν„΄μŠ€)λŠ” this에 λ°”μΈλ”©λ˜μ–΄ constructor λ‚΄λΆ€μ˜ thisλŠ” ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킴

2. μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”

  • constructor λ‚΄λΆ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜μ–΄ this에 바인딩 λ˜μ–΄μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”
    • this에 바인딩 λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€μ— ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€
    • constructorκ°€ 인수둜 전달받은 μ΄ˆκΈ°κ°’μœΌλ‘œ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹° 값을 μ΄ˆκΈ°ν™”
  • λ§Œμ•½ constructorκ°€ μƒλž΅λ˜μ—ˆλ‹€λ©΄ 이 과정은 μƒλž΅λ¨

3. μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

  • 클래슀의 λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚˜λ©΄ μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ thisλ₯Ό μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜

ν”„λ‘œνΌν‹°

μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°

constructor 내뢀에 μ •μ˜λœ ν”„λ‘œνΌν‹°λ‘œ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λŠ” μ–Έμ œλ‚˜ publicν•©λ‹ˆλ‹€.

 

μ ‘κ·Όμž ν”„λ‘œνΌν‹°

μžμ²΄μ μœΌλ‘œλŠ” 값을 갖지 μ•Šκ³  λ‹€λ₯Έ 데이터 ν”„λ‘œνΌν‹°μ˜ 값을 μ½κ±°λ‚˜ μ €μž₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ ‘κ·Όμž ν•¨μˆ˜λ‘œ κ΅¬μ„±λœ ν”„λ‘œνΌν‹°λ‘œ getter ν•¨μˆ˜μ™€ setterν•¨μˆ˜λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • getter : μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•  λ•Œλ§ˆλ‹€ ν”„λ‘œνΌν‹° 값을 μ‘°μž‘ν•˜κ±°λ‚˜ λ³„λ„μ˜ ν–‰μœ„κ°€ ν•„μš”ν•  λ•Œ μ‚¬μš©
  • setter : μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ— 값을 ν• λ‹Ήν•  λ•Œλ§ˆλ‹€ ν”„λ‘œνΌν‹° 값을 μ‘°μž‘ν•˜κ±°λ‚˜ λ³„λ„μ˜ ν–‰μœ„κ°€ ν•„μš”ν•  λ•Œ μ‚¬μš©
class Person {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    // fullName은 μ ‘κ·Όμž ν•¨μˆ˜λ‘œ κ΅¬μ„±λœ μ ‘κ·Όμž ν”„λ‘œνΌν‹°
    // getter ν•¨μˆ˜
    get fullName() {
    	return `${this.firstName} ${this.lastName}`;
    }
    
    // setter ν•¨μˆ˜
    set fullName(name) {
    	[this.firstName, this.lastName] = name.spilt(' ');
    }
}

const me = new Person('Ungmo', 'Lee');

// setter ν•¨μˆ˜κ°€ 호좜
me.fullName = 'Heegun Lee';

// getter ν•¨μˆ˜κ°€ 호좜
console.log(me.fullName); // Heegun Lee

 

클래슀 ν•„λ“œ μ •μ˜ μ œμ•ˆ

클래슀 ν•„λ“œλž€ 클래슀 기반 객체지ν–₯ μ–Έμ–΄μ—μ„œ ν΄λž˜μŠ€κ°€ 생성할 μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°λ₯Ό κ°€λ¦¬ν‚€λŠ” μš©μ–΄μž…λ‹ˆλ‹€.

 

μžλ°” 같은 클래슀 기반 μ–Έμ–΄μ—μ„œ 클래슀 ν•„λ“œλŠ” 마치 클래슀 λ‚΄λΆ€μ—μ„œ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 클래슀 λͺΈμ²΄μ—λŠ” λ©”μ„œλ“œλ§Œ μ„ μ–Έν•  수 있기 λ•Œλ¬Έμ— λ°˜λ“œμ‹œ constructorλ‚΄λΆ€μ—μ„œ thisλ₯Ό μ‚¬μš©ν•΄ 클래슀 ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•΄μ•Όν•©λ‹ˆλ‹€.

 

class Person {
    // 클래슀 ν•„λ“œ μ΄ˆκΈ°ν™”
    constructor(name) {
        this.name = name;
    }
}

const me = new Person('Lee');
console.log(me); // Person {name: "Lee"}

 

ν•¨μˆ˜λŠ” 일급 κ°μ²΄μ΄λ―€λ‘œ ν•¨μˆ˜λ₯Ό 클래슀 ν•„λ“œμ— ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 클래슀 ν•„λ“œλ₯Ό 톡해 λ©”μ„œλ“œλ₯Ό μ •μ˜ν• μˆ˜λ„ μžˆμ§€λ§Œ 이 ν•¨μˆ˜λŠ” ν”„λ‘œν¬νƒ€μž… λ©”μ„œλ“œκ°€ μ•„λ‹Œ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œκ°€ 되기 λ•Œλ¬Έμ— ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

**μ΅œμ‹  Node.js(v.12)에선 μžλ°”μ™€ μœ μ‚¬ν•˜κ²Œ 클래슀 ν•„μŠ€λ₯Ό μ„ μ–Έν•  수 μžˆμ§€λ§Œ 아직 ECMAScript 정식 ν‘œμ€€ 사양이 μ•„λ‹˜

 

private ν•„λ“œ μ •μ˜ μ œμ•ˆ

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μΊ‘μŠν™”λ₯Ό μ™„μ „ν•˜κ²Œ μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 클래슀 ν•„λ“œ μ •μ˜ μ œμ•ˆμ„ μ‚¬μš©ν•˜λ”λΌλ„ 클래슀 ν•„λ“œλŠ” 기본적으둜 publicν•˜κΈ° λ•Œλ¬Έμ— 외뢀에 κ·ΈλŒ€λ‘œ λ…ΈμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, TC39 ν”„λ‘œνŽ˜μŠ€μ˜ stage 3에 private ν•„λ“œλ₯Ό μ •μ˜ν•  수 μžˆλŠ” μƒˆλ‘œμš΄ ν‘œμ€€ 사양이 μ œμ•ˆλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

class Person {
    //private ν•„λ“œ μ •μ˜
    #name = '';

    constructor(name) {
        this.#name = name;
    }
    
    get name() {
    	// private ν•„λ“œλ₯Ό μ°Έμ‘°ν•˜λ©° trimν•œ λ‹€μŒ λ°˜ν™˜
        return this.#name.trim();
    }
}

const me = new Person(' Lee ');

// private ν•„λ“œλŠ” 클래슀 μ™ΈλΆ€μ—μ„œ μ°Έμ‘° X
console.log(me.#name); // SyntaxError

console.log(me.name); // Lee
  • private ν•„λ“œμ˜ μ„ λ‘μ—λŠ” #을 λΆ™μ—¬μ£Όκ³  private ν•„λ“œλ₯Ό μ°Έμ‘°ν•  λ•Œλ„ #을 λΆ™μ—¬μ£Όμ–΄μ•Ό 함
  • private ν•„λ“œλŠ” 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘° κ°€λŠ₯
    (public ν•„λ“œλŠ” 클래슀 λ‚΄λΆ€, μžμ‹ 클래슀 λ‚΄λΆ€, 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅ν•œ μ ‘κ·Ό λ“± μ–΄λ””μ„œλ“  μ°Έμ‘° κ°€λŠ₯)
  • private ν•„λ“œλŠ” λ°˜λ“œμ‹œ 클래슀 λͺΈμ²΄μ— μ •μ˜ν•΄μ•Ό 함 (직접 constructor에 μ •μ˜ν•˜λ©΄ μ—λŸ¬)
  • μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 방법은 μœ νš¨ν•¨

 

static ν•„λ“œ μ •μ˜ μ œμ•ˆ

ν΄λž˜μŠ€μ—μ„œ static ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ 정적 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆμ§€λ§Œ, static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 정적 ν•„λ“œλ₯Ό μ •μ˜ν•  μˆ˜λŠ” μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, TC39 ν”„λ‘œνŽ˜μŠ€μ˜ stage 3에 static public ν•„λ“œ, static private ν•„λ“œ, static private λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλŠ” μƒˆλ‘œμš΄ ν‘œμ€€ 사양인 "Static class features"κ°€ μ œμ•ˆλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

class MyMath {
    // static public ν•„λ“œ μ •μ˜
    static PI = 22 / 7;
    
    // static private ν•„λ“œ μ •μ˜
    static #num = 10;
    
    // static λ©”μ„œλ“œ
    static increment() {
    	return ++MyMath.#num;
    }
}

console.log(MyMath.PI); // 3.142857...
console.log(MyMath.increment()); // 11

상속에 μ˜ν•œ 클래슀 ν™•μž₯

ν”„λ‘œν† νƒ€μž… 기반 상속은 ν”„λ‘œν† νƒ€μž… 체인을 톡해 λ‹€λ₯Έ 객체의 μžμ‚°μ„ μƒμ†λ°›λŠ” κ°œλ…μ΄μ§€λ§Œ, 상속에 μ˜ν•œ 클래슀 ν™•μž₯은 κΈ°μ‘΄ 클래슀λ₯Ό 상속받아 μƒˆλ‘œμš΄ 클래슀λ₯Ό ν™•μž₯ν•˜μ—¬ μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

클래슀 상속과 μƒμ„±μž ν•¨μˆ˜ 상속

ν΄λž˜μŠ€λŠ” 상속을 톡해 κΈ°μ‘΄ 클래슀λ₯Ό ν™•μž₯ν•  수 μžˆλŠ” 문법이 기본적으둜 μ œκ³΅λ˜μ§€λ§Œ μƒμ„±μž ν•¨μˆ˜λŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. 즉, ν΄λž˜μŠ€λŠ” extends ν‚€μ›Œλ“œκ°€ 기본적으둜 μ œκ³΅λ˜μ–΄ 클래슀 ν™•μž₯이 κ°„νŽΈν•˜κ³  μ§κ΄€μ μž…λ‹ˆλ‹€.

 

extends ν‚€μ›Œλ“œ

상속을 톡해 클래슀λ₯Ό ν™•μž₯ν•˜λ €λ©΄ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 상속받을 클래슀λ₯Ό μ •μ˜ν•˜λŠ”λ°, extends ν‚€μ›Œλ“œμ˜ 역할은 μˆ˜νΌν΄λž˜μŠ€μ™€ μ„œλΈŒν΄λž˜μŠ€ κ°„μ˜ 상속 관계λ₯Ό μ„€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

// 수퍼(베이슀/λΆ€λͺ¨)클래슀
class Base {};

// μ„œλΈŒ(νŒŒμƒ/μžμ‹) 클래슀
class Derived extends Base {}
  • μ„œλΈŒ 클래슀 : 상속을 톡해 ν™•μž₯된 클래슀
  • 수퍼 클래슀 : μ„œλΈŒν΄λž˜μŠ€μ—κ²Œ μƒμ†λœ 클래슀

ν΄λž˜μŠ€λ„ ν”„λ‘œν† νƒ€μž…μ„ 톡해 상속 관계λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ°, 수퍼 ν΄λž˜μŠ€μ™€ μ„œλΈŒν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž… 체인뿐 μ•„λ‹ˆλΌ 클래슀 κ°„μ˜ ν”„λ‘œν† νƒ€μž… 체인도 μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œ λͺ¨λ‘ 상속이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

 

 

동적 상속

extends ν‚€μ›Œλ“œλŠ” 클래슀뿐만 μ•„λ‹ˆλΌ μƒμ„±μž ν•¨μˆ˜λ₯Ό 상속받아 클래슀λ₯Ό ν™•μž₯ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 단, extends ν‚€μ›Œλ“œ μ•žμ—λŠ” λ°˜λ“œμ‹œ ν΄λž˜μŠ€κ°€ μ™€μ•Όν•©λ‹ˆλ‹€.

 

// μƒμ„±μž ν•¨μˆ˜
function Base(a) {
    this.a = a;
}

// μƒμ„±μž ν•¨μˆ˜λ₯Ό μƒμ†λ°›λŠ” μ„œλΈŒν΄λž˜μŠ€
class Derived extends Base {}

const derived = new Derived(1);
console.log(derived); // Derived {a: 1}

 

ν•˜μ§€λ§Œ, extends ν‚€μ›Œλ“œ λ‹€μŒμ—λŠ” 클래슀뿐만 μ•„λ‹ˆλΌ [[Contruct]] λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό κ°–λŠ” ν•¨μˆ˜ 객체둜 평가될 수 μžˆλŠ” λͺ¨λ“  ν‘œν˜„μ‹μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 λ™μ μœΌλ‘œ 상속받을 λŒ€μƒμ„ κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

function Base1() {}

class Base2() {}

let condition = true;

// 쑰건에 따라 λ™μ μœΌλ‘œ 상속 λŒ€μƒμ„ κ²°μ •ν•˜λŠ” μ„œλΈŒν΄λž˜μŠ€
class Derived extends (condition ? Base1 : Base2) {}

const derived = new Derived();
console.log(derived); // Derived {}

console.log(derived instanceof Base1); // true
console.log(derived instanceof Base2); // false

 

μ„œλΈŒν΄λž˜μŠ€μ˜ constructor

μ„œλΈŒν΄λž˜μŠ€μ—μ„œ constructorλ₯Ό μƒλž΅ν•˜λ©΄ ν΄λž˜μŠ€μ— λ‹€μŒκ³Ό 같은 constructorκ°€ μ•”λ¬΅μ μœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€.

 

constructor(...args) { super(...args); }

 

μ΄λ•Œ, argsλŠ” new μ—°μ‚°μžμ™€ ν•¨κ»˜ 클래슀λ₯Ό ν˜ΈμΆœν•  λ•Œ μ „λ‹¬ν•œ 인수 리슀크이고 super()λŠ” 수퍼클래슀의 constructorλ₯Ό ν˜ΈμΆœν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

 

super ν‚€μ›Œλ“œ

super ν‚€μ›Œλ“œλŠ” ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœν•  μˆ˜λ„ 있고 this와 같이 μ‹λ³„μžμ²˜λŸΌ μ°Έμ‘°ν•  수 μžˆλŠ” νŠΉμˆ˜ν•œ ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

  • super을 호좜 : 수퍼클래슀의 constructorλ₯Ό 호좜
    • μ„œλΈŒν΄λž˜μŠ€μ—μ„œ constructorλ₯Ό μƒλž΅ν•˜μ§€ μ•ŠλŠ” 경우 μ„œλΈŒν΄λž˜μŠ€μ˜ constructorμ—μ„œλŠ” λ°˜λ“œμ‹œ superλ₯Ό ν˜ΈμΆœν•΄μ•Ό 함
    • μ„œλΈŒν΄λž˜μŠ€μ˜ constructorμ—μ„œ superλ₯Ό ν˜ΈμΆœν•˜κΈ° μ „μ—λŠ” thisλ₯Ό μ°Έμ‘°ν•  수 μ—†μŒ
    • super은 λ°˜λ“œμ‹œ μ„œλΈŒν΄λž˜μŠ€μ˜ constructorμ—μ„œλ§Œ 호좜 κ°€λŠ₯
class Base {
    constructor(a, b) {
    	this.a = a;
        this.b = b;
    }
}

class Derived extends Base {
	constructor(a, b, c) {
    	super(a, b);
        this.c = c;
    }
}

const derived = new Derived(1,2,3);
console.log(derived); // Derived {a:1, b:2, c:3}

 

  • super을 μ°Έμ‘° : 수퍼클래슀의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 있음
    • μ„œλΈŒν΄λž˜μŠ€μ˜ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ λ‚΄μ—μ„œ super.sayHiλŠ” 수퍼클래슀의 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ sayHiλ₯Ό κ°€λ₯΄ν‚΄
    • μ„œλΈŒν΄λž˜μŠ€μ˜ 정적 λ©”μ„œλ“œ λ‚΄μ—μ„œ super.sayHelloλŠ” 수퍼클래슀의 정적 λ©”μ„œλ“œ sayHelloλ₯Ό 가리킴
class Base {
    constructor(name) {
        this.name = name;
    }
    
    sayHi() {
    	return `Hi! ${this.name}`;
    }
    
    static sayHello() {
    	return `Hello!`;
	}
}

class Derived extends Base {
    sayHi() {
        return `${super.sayHi()}. how are you doing?`;
    }
    
    static sayHello() {
        return `${super.sayHello()} how are you doing?`;
    }
}

const derived = new Derived('Lee');
console.log(derived.sayHi()); // Hi! Lee. how are you doing?

console.log(Derived.sayHi()); // Hello! how are you doing?

 

상속 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

μ§μ‚¬κ°ν˜•μ„ μΆ”μƒν™”ν•œ Rectagle ν΄λž˜μŠ€μ™€ 상속을 톡해 ν™•μž₯ν•œ ColorRectangle 클래슀λ₯Ό μ •μ˜ν•˜λŠ” 과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

// 수퍼클래슀
class Rectangle {
  constructor(width, height) {
    this.width = width;
    this.height = height;
  }

  getArea() {
    return this.width * this.height;
  }

  toString() {
    return `width = ${this.width}, height = ${this.height}`;
  }
}

// μ„œλΈŒν΄λž˜μŠ€
class ColorRectangle extends Rectangle {
  constructor(width, height, color) {
    super(width, height);
    this.color = color;
  }

  // λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©
  toString() {
    return super.toString() + `, color = ${this.color}`;
  }
}

const colorRectangle = new ColorRectangle(2, 4, 'red');
console.log(colorRectangle); // ColorRectangle {width: 2, height: 4, color: "red"}

// 상속을 톡해 getArea λ©”μ„œλ“œλ₯Ό 호좜
console.log(colorRectangle.getArea()); // 8
// μ˜€λ²„λΌμ΄λ”©λœ toString λ©”μ„œλ“œλ₯Ό 호좜
console.log(colorRectangle.toString()); // width = 2, height = 4, color = red

 

1. μ„œλΈŒν΄λž˜μŠ€μ˜ super 호좜

  • μ„œλΈŒν΄λž˜μŠ€λŠ” μžμ‹ μ΄ 직접 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  μˆ˜νΌν΄λž˜μŠ€μ—κ²Œ μΈμŠ€ν„΄μŠ€ 생성을 μœ„μž„

2. 수퍼클래슀의 μΈμŠ€ν„΄μŠ€ 생성과 this 바인딩

  • μˆ˜νΌν΄λž˜μŠ€κ°€ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œ 빈 객체(μΈμŠ€ν„΄μŠ€)κ°€ μƒμ„±λ˜κ³  this에 바인딩됨
  • new μ—°μ‚°μžμ™€ ν•¨κ»˜ 호좜된 ν•¨μˆ˜(μΈμŠ€ν„΄μŠ€)λŠ” new.target이 κ°€λ¦¬ν‚€λŠ” μ„œλΈŒν΄λž˜μŠ€κ°€ μƒμ„±ν•œ κ²ƒμœΌλ‘œ 처리됨

3. 수퍼클래슀의 μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”

  • 수퍼클래슀의 constructorκ°€ μ‹€ν–‰λ˜μ–΄ this에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”

4. μ„œλΈŒν΄λž˜μŠ€ constructor둜의 볡귀와 this 바인딩

  • super의 호좜이 μ’…λ£Œλ˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜
  • μ„œλΈŒν΄λž˜μŠ€λŠ” λ³„λ„μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  superκ°€ λ°˜ν™˜ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό this에 λ°”μΈλ”©ν•˜μ—¬ μ‚¬μš©

5. μ„œλΈŒν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”

  • μ„œλΈŒν΄λž˜μŠ€μ˜ constructorκ°€ μ‹€ν–‰λ˜μ–΄ this에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”

6. μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

  • 클래슀의 λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚˜λ©΄ μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ thisλ₯Ό μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜

ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜ ν™•μž₯

String, Number, Array 같은 ν‘œμ€€ 빌트인 객체도 [[Construct]] λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό κ°–λŠ” μƒμ„±μž ν•¨μˆ˜μ΄λ―€λ‘œ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

// Array μƒμ„±μž ν•¨μˆ˜λ₯Ό 상속받아 ν™•μž₯ν•œ MyArray
class MyArray extends Array {
  // μ€‘λ³΅λœ λ°°μ—΄ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜ν•œλ‹€: [1, 1, 2, 3] => [1, 2, 3]
  uniq() {
    return this.filter((v, i, self) => self.indexOf(v) === i);
  }

  // λͺ¨λ“  λ°°μ—΄ μš”μ†Œμ˜ 평균을 κ΅¬ν•œλ‹€: [1, 2, 3] => 2
  average() {
    return this.reduce((pre, cur) => pre + cur, 0) / this.length;
  }
}

const myArray = new MyArray(1, 1, 2, 3);
console.log(myArray); // MyArray(4) [1, 1, 2, 3]

// MyArray.prototype.uniq 호좜
console.log(myArray.uniq()); // MyArray(3) [1, 2, 3]
// MyArray.prototype.average 호좜
console.log(myArray.average()); // 1.75

 

μœ„μ˜ μ˜ˆμ œμ™€ 같이 Array μƒμ„±μž ν•¨μˆ˜λ₯Ό 상속받아 ν™•μž₯ν•œ MyArray ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λŠ” Array.prototypeκ³Ό MyArray.prototype의 λͺ¨λ“  λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


 

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr