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

객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성방식은 κ°€μž₯ 일반적으고 κ°„λ‹¨ν•œ 객체 생성 λ°©μ‹μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 이외에도 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ 객체λ₯Ό 생성할 수 있고 각각의 μž₯단점이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

** 객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성 방식에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜λ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

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

 

[JavaScript] 객체 λ¦¬ν„°λŸ΄

κ°μ²΄λž€? μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 개체기반의 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ, μ›μ‹œ 값을 μ œμ™Έν•œ λͺ¨λ“  값은 κ°μ²΄νƒ€μž…μž…λ‹ˆλ‹€. μ΄λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ κ΅¬μ„±ν•œ 볡합적인 자료ꡬ쑰둜 μ›μ‹œ κ°’κ³Ό λ‹€λ₯΄κ²Œ

j-su2.tistory.com

 


Object μƒμ„±μž ν•¨μˆ˜

new μ—°μ‚°μžμ™€ ν•¨κ»˜ Object μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 빈 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€. 이후 ν”„λ‘œνΌν‹° λ˜λŠ” λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ 객체λ₯Ό μ™„μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, Object μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방식은 νŠΉλ³„ν•œ μ΄μœ κ°€ μ—†μœΌλ©΄ 그닀지 μœ μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • μƒμ„±μž ν•¨μˆ˜ : new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜μ—¬ 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜
  • μΈμŠ€ν„΄μŠ€ : μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•΄ μƒμ„±λœ 객체
const person = new Object();

person.name = 'Lee';
person.sayHello = function () {
    console.log('Hi! My name is ' + this.name);
};

console.log(person); {name: "Lee", sayHello: f}
person.sayHello(); // Hi! My name is Lee

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” Object μƒμ„±μž 이외에도 String, Number, Boolean, Function, Array, Date, RegExp, Promise λ“±μ˜ 빌트인 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

 


μƒμ„±μž ν•¨μˆ˜

객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성 λ°©μ‹μ˜ 문제점

κ°„λ‹¨ν•˜μ§€λ§Œ 단 ν•˜λ‚˜μ˜ κ°μ²΄λ§Œμ„ μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— λ™μΌν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό μ—¬λŸ¬ 개 μƒμ„±ν•˜λŠ” 경우 λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€.

 

μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 λ°©μ‹μ˜ μž₯점

μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 방식은 마치 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦Ώ(클래슀)처럼 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œνΌν‹° ꡬ쑰가 λ™μΌν•œ 객체 μ—¬λŸ¬κ°œλ₯Ό κ°„νŽΈν•˜κ²Œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μƒμ„±μž ν•¨μˆ˜λŠ” 이름 κ·Έλž˜λ„ 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν˜•μ‹μ΄ μ •ν•΄μ Έ μžˆμ§€ μ•Šμ•„μ„œ 일반 ν•¨μˆ˜μ™€ λ™μΌν•œ λ°©λ²•μœΌλ‘œ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

// μƒμ„±μž ν•¨μˆ˜
function Circle(radius) {
    this.radius = redius;
    this.getDiameter = function () {
        return 2 * this.radius;
    };
}

// μΈμŠ€ν„΄μŠ€ 생성
const circle1 = new Circle(5);
const circle2 = new Circle(10);

console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20

// new μ—°μ‚°μžκ°€ μ—†μ–΄μ„œ 일반 ν•¨μˆ˜λ‘œμ„œ 호좜됨
const circle3 = Circle(15);

// 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλ˜μ–΄ λ°˜ν™˜λ¬Έμ΄ μ—†μŒ
console.log(circle3); // undefined

// thisλŠ” μ „μ—­ 개체λ₯Ό 가리킴
console.log(radius); // 15

 

 

μƒμ„±μž ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

μƒμ„±μž ν•¨μˆ˜μ˜ 역할은 μΈμŠ€ν„΄μŠ€λ₯Ό 생성(ν•„μˆ˜)ν•˜κ³  μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”(μ˜΅μ…˜)ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

  1. μΈμŠ€ν„΄μŠ€ 생성과 this *바인딩 : μ•”λ¬΅μ μœΌλ‘œ 빈 객체가 μƒμ„±λ˜κ³  this에 바인딩됨. λŸ°νƒ€μž„ 이전에 μ‹€ν–‰.
  2. μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” : μƒμ„±μž ν•¨μˆ˜μ˜ μ½”λ“œκ°€ ν•œ 쀄씩 μ‹€ν–‰λ˜μ–΄ this에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”. κ°œλ°œμžκ°€ 기술.
  3. μΈμŠ€ν„΄μŠ€ λ°˜ν™˜ : μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ˜ λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚œ ν›„ μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ thisκ°€ μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜λ¨

*바인딩 : μ‹λ³„μžμ™€ 값을 μ—°κ²°ν•˜λŠ” κ³Όμ •

 

λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]]κ³Ό [[Construct]]

ν•¨μˆ˜λŠ” 객체이기 λ•Œλ¬Έμ— 일반 객체가 가지고 μžˆλŠ” λ‚΄λΆ€ 슬둯과 λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ 가지고 있고, [[Environment]], [[FormalParameters]] λ“±μ˜ λ‚΄λΆ€ 슬둯과 [[Call]], [[Construct]] 같은 λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό μΆ”κ°€λ‘œ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

  • 일반 ν•¨μˆ˜λ‘œμ„œ 호좜되면 ν•¨μˆ˜ 객체의 λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]]이 호좜
  • new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜되면 λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]]κ°€ 호좜
  • callable 객체 :  [[Call]]을 κ°–λŠ” ν•¨μˆ˜ 객체둜 호좜 κ°€λŠ₯ν•œ ν•¨μˆ˜
  • constructor 객체 :  [[Construct]]을 κ°–λŠ” ν•¨μˆ˜ 객체둜 μƒμ„±μžλ‘œ 호좜 κ°€λŠ₯ν•œ ν•¨μˆ˜
  • non-constructor 객체 :  [[Construct]]을 갖지 μ•ŠλŠ” ν•¨μˆ˜ 객체둜 μƒμ„±μžλ‘œ 호좜 λΆˆκ°€λŠ₯ν•œ ν•¨μˆ˜

λͺ¨λ“  ν•¨μˆ˜λŠ” callable ν•΄μ„œ ν˜ΈμΆœν•  수 μžˆμ§€λ§Œ, λͺ¨λ“  ν•¨μˆ˜ 객체가 constructorν•œκ²ƒμ€ μ•„λ‹™λ‹ˆλ‹€.

 

constructor와 non-constructor의 ꡬ뢄

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ μ •μ˜λ₯Ό ν‰κ°€ν•˜μ—¬ ν•¨μˆ˜ 객체λ₯Ό 생성할 λ•Œ ν•¨μˆ˜ μ •μ˜ 방식에 따라 ν•¨μˆ˜λ₯Ό constructor와 non-constructor둜 κ΅¬λΆ„ν•©λ‹ˆλ‹€.

  • constructor : ν•¨μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ ν‘œν˜„μ‹, 클래슀
  • non-constructor : λ©”μ„œλ“œ(ES6 λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„), ν™”μ‚΄ν‘œ ν•¨μˆ˜

new μ—°μ‚°μž

일반 ν•¨μˆ˜μ™€ μƒμ„±μž ν•¨μˆ˜μ—λŠ” νŠΉλ³„ν•œ ν˜•μ‹μ  차이 없이 μ˜€λ‘œμ§€ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ—ˆλƒμ— 따라 κ΅¬λΆ„λ©λ‹ˆλ‹€. λ”°λΌμ„œ μƒμ„±μž ν•¨μˆ˜λŠ” 일반적으둜 첫 문자λ₯Ό λŒ€λ¬Έμžλ‘œ κΈ°μˆ ν•˜λŠ” 파슀칼 μΌ€μ΄μŠ€λ‘œ λͺ…λͺ…ν•˜μ—¬ 일반 ν•¨μˆ˜μ™€ κ΅¬λ³„ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

 

new.target

new.target은 new μ—°μ‚°μž 없이 μƒμ„±μž ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ ES6μ—μ„œ μΆ”κ°€λœ κ²ƒμœΌλ‘œ, this와 μœ μ‚¬ν•˜κ²Œ constructor인 λͺ¨λ“  ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 암묡적인 지역 λ³€μˆ˜μ™€ 같이 μ‚¬μš©λ˜λ©° 메타 ν”„λ‘œνΌν‹°λΌκ³ λ„ λΆ€λ¦…λ‹ˆλ‹€.

(IEλŠ” 지원X -> μŠ€μ½”ν”„ 세이프 μƒμ„±μž νŒ¨ν„΄ μ‚¬μš©)

  • new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜 : ν•¨μˆ˜ λ‚΄λΆ€μ˜ new.target은 ν•¨μˆ˜ μžμ‹ μ„ κ°€λ₯΄ν‚΄
  • new μ—°μ‚°μž 없이 일반 ν•¨μˆ˜λ‘œμ„œ 호좜 : ν•¨μˆ˜ λ‚΄λΆ€μ˜ new.target은 undefined

λ”°λΌμ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ new.target을 μ‚¬μš©ν•˜μ—¬ new μ—°μ‚°μžμ™€ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν–ˆλŠ”μ§€ ν™•μΈν•˜μ—¬ 그렇지 μ•Šμ€ 경우 new μ—°μ‚°μžμ™€ ν•¨κ»˜ μž¬κ·€ ν˜ΈμΆœμ„ 톡해 μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// μƒμ„±μž ν•¨μˆ˜
function Circle(radius) {
    // new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ§€ μ•Šμ•˜μœΌλ©΄ undefined
    if(!new.target) {
        // new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ₯Ό μž¬κ·€ ν˜ΈμΆœν•˜μ—¬ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜
        return new Circle(radius);
    }
    this.radius = radius;
    this.getDiameter = function () {
    	return 2 * this.radius;
    };
}

// new μ—°μ‚°μž 없이 ν˜ΈμΆœν•΄λ„ new.target을 톡해 μƒμ„±μž ν•¨μˆ˜λ‘œ 호좜
const circle = Circle(5);
console.log(circle.getDiamater()); // 10

 

 

 

 

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

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

 

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

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

wikibook.co.kr