Skip to content

Latest commit

Β 

History

History
207 lines (165 loc) Β· 9.75 KB

mojaeya.md

File metadata and controls

207 lines (165 loc) Β· 9.75 KB

객체

객체의 생성

// 1. 객체 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•˜λŠ” 법
var card = {suit: "ν•˜νŠΈ", rank: "A"}

// 2. μƒμ„±μžλ‘œ μƒμ„±ν•˜λŠ” 법
function Card(Suit,rank) {
 this.suit = suit;
 this.rank = rank;
}
var card = new Card("ν•˜νŠΈ","A");

// 3. Object.create둜 μƒμ„±ν•˜λŠ” 방법 
var card = Object.create(Object.prototype,{
    suit: {
       value: "ν•˜νŠΈ",
       writable: true,
       enumerable: true,
       configurable: true
    },
    rank: {
       value: "A",
       writable: true,
       enumerable: true,
       configurable: true
    }
}); 

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

μƒμ„±μž μ•ˆμ—μ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” λ°©μ‹μ˜ 문제점

  • μƒμ„±μž μ•ˆμ—μ„œ this 뒀에 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λ©΄ κ·Έ μƒμ„±μžλ‘œ μƒμ„±ν•œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— λ˜‘κ°™μ€ λ©”μ„œλ“œκ°€ μΆ”κ°€ λœλ‹€. κ·Έλž˜μ„œ λ©”λͺ¨λ¦¬λ₯Ό 많이 μ†ŒλΉ„ν•˜κ²Œ λœλ‹€.
function Circle(center,radius) {
    this.center = center;
    this.radius = radius;
    this.area = function() {
        return Math.PI*this.radius*this.radius;
    };
}
var c1 = new Circle({x:0, y:0}, 2.0);
var c2 = new Circle({x:0, y:1}, 3.0);
var c3 = new Circle({x:1, y:0}, 1.0);
  • 각각의 μΈμŠ€ν„΄μŠ€κ°€ λ˜‘κ°™μ€ λ©”μ„œλ“œ areaλ₯Ό μ†Œμœ ν•œλ‹€.

ν”„λ‘œν† νƒ€μž… 객체

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ„ κ°μ²΄μ΄λ―€λ‘œ ν•¨μˆ˜ 객체가 기본적으둜 prototype ν”„λ‘œνΌν‹°λ₯Ό κ°–κ³  μžˆλ‹€. (proto ν”„λ‘œνΌν‹°λž‘μ€ λ‹€λ₯Έκ±°λ‹€!)
function F() {};
console.log(F.prototype) // Object {}
  • prototype 속성은 μžμ‹ μ˜ prototype 객체둜 μžμ‹ 객체(μƒμ„±μžλ‘œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€)κ°€ μ°Έμ‘°ν•˜λŠ” 객체이닀.

  • ν”„λ‘œν† νƒ€μž… 객체의 ν”„λ‘œνΌν‹°λŠ” μƒμ„±μžλ‘œ μƒμ„±ν•œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ κ·Έ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°μ²˜λŸΌ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
F.protoype.prop = "prototype value";
var obj = new F(); 
console.log(obj.prop); // prototype value

πŸ”₯ ν”„λ‘œν† νƒ€μž… 객체의 ν”„λ‘œνΌν‹°λŠ” 읽기만 κ°€λŠ₯ν•˜κ³  μˆ˜μ •μ΄ λΆˆκ°€λŠ₯!!!

// μΈμŠ€ν„°μŠ€μ˜ ν”„λ‘œνΌν‹°μ— 값을 λŒ€μž…ν–ˆμ„ λ•Œ 이름이 같은 ν”„λ‘œνΌν‹°κ°€ 있으면 κ·Έ ν”„λ‘œνΌν‹°μ— 값을 λŒ€μž….
obj.prop = "instance value"; //  그렇지 μ•Šμ€ 경우 μΈμŠ€ν„΄μŠ€μ— κ·Έ μ΄λ¦„μœΌλ‘œ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•œ 후에 값을 λŒ€μž…
console.log(obj.prop); // instance value
console.log(F.prototype.prop); // prototype value

βœ“ μ΄λ ‡κ²Œ ν”„λ‘œν† νƒ€μž… 객체의 ν”„λ‘œνΌν‹°λ₯Ό μΈμŠ€ν„°μŠ€μ—μ„œ μ°Έμ‘°ν•  수 μžˆλŠ” 상황을 κ°€λ¦¬μΌœ 'μΈμŠ€ν„΄μŠ€κ°€ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μƒμ†ν•˜κ³  μžˆλ‹€' 라고 ν•œλ‹€.

πŸ“Œ μ•žμ—μ„œ μ–˜κΈ°ν•œ μƒμ„±μž μ•ˆμ—μ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” λ°©μ‹μ˜ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜λŠ” 법 (λ©”λͺ¨λ¦¬ λ‚­λΉ„ ν”Όν•˜λŠ” 법)

// Circle μƒμ„±μž
function Circle(center,radius) {
    this.center = center;
    this.radius = radius;
}
// Circle μƒμ„±μžμ˜μ˜ prototype ν”„λ‘œνΌν‹°μ— area λ©”μ„œλ“œλ₯Ό μΆ”κ°€
Circle.prototype.area = function() {
  return Math.PI*this.radius*this.radius;  // λ©”μ„œλ“œ μ•ˆμ˜ thisλŠ” μƒμ„±μžλ‘œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀.
};
// Circle μƒμ„±μžλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성
var c1 = new Circle({x:0, y:0}, 2.0);
var c2 = new Circle({x:0, y:1}, 3.0);
var c3 = new Circle({x:1, y:0}, 1.0);
console.log("넓이 = " + c1.area()); // 넓이 = 12.566370614359172
  • μœ„μ˜ μ½”λ“œμ—μ„œ μΈμŠ€ν„΄μŠ€ c1,c2,c3 μ•ˆμ—λŠ” area λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ ν”„λ‘œν† νƒ€μž…μ— μ •μ˜ν–ˆκΈ° λ•Œλ¬Έμ— area λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
  • 이처럼 μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž… 객체에 λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ μΈμŠ€ν„΄μŠ€μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ•„λ„ μΈμŠ€ν„΄μŠ€κ°€ ν”„λ‘œν† νƒ€μž… 객체의 λ©”μ„œλ“œλ₯Ό 상속 λ°›μ•„ μ‚¬μš© ν•  수 μžˆμ–΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό ν”Όν•  수 μžˆλ‹€.


ν”„λ‘œν† νƒ€μž… 상속

상속

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 상속은 ν”„λ‘œν† νƒ€μž… 체인이라고 λΆ€λ₯ΈλŠ” 객체의 자료ꡬ쑰둜 κ΅¬ν˜„λ˜μ–΄ 있으며, 'ν”„λ‘œν† νƒ€μž… 상속'이라고 λΆ€λ₯Έλ‹€.
  • 상속을 ν•˜λŠ” 이유 : 상속을 μ‚¬μš©ν•˜λ©΄ 이미 μ •μ˜λœ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œμ˜ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 있고 μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•΄μ„œ ν™•μž₯된 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. 쀑볡 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ μœ μ§€ λ³΄μˆ˜μ„±μ΄ 높은 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ 수 μžˆλ‹€.

ν”„λ‘œν† νƒ€μž… 체인

λ‚΄λΆ€ ν”„λ‘œνΌν‹° [[Prototype]]

  • λͺ¨λ“  κ°μ²΄λŠ” λ‚΄λΆ€ ν”„λ‘œνΌν‹° [[Prototype]]을 가지고 μžˆλ‹€. ❗️이것은 ν•¨μˆ˜ 객체의 prototype ν”„λ‘œνΌν‹°μ™€λŠ” λ‹€λ₯Έ 객체닀❗️
  • ES5κΉŒμ§€λŠ” μ‚¬μš©μžκ°€ λ‚΄λΆ€ ν”„λ‘œνΌν‹° [[Prototype]]을 μ½κ±°λ‚˜ μ“Έ 수 μ—†μ—ˆμ§€λ§Œ, ES6λΆ€ν„°λŠ” proto ν”„λ‘œνΌν‹°μ— [Prototype]]의 값이 μ €μž₯λœλ‹€.

κ·ΈλŸ¬λ―€λ‘œ 이 ν¬μŠ€νŒ…μ—μ„œλŠ” [[Prototype]] λŒ€μ‹ μ— __proto__둜 ν‘œκΈ°ν•˜κ² λ‹€.

ν”„λ‘œν† νƒ€μž… 체인

객체의 proto ν”„λ‘œνΌν‹°λŠ” κ·Έ κ°μ²΄μ—κ²Œ 상속을 ν•΄μ€€, 즉 μœ μ „μžλ₯Ό λ¬Όλ €μ€€ λΆ€λͺ¨ 객체λ₯Ό 가리킨닀.
λ”°λΌμ„œ κ°μ²΄λŠ” proto ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” λΆ€λͺ¨ 객체의 ν”„λ‘œνΌν‹°λ₯Ό λ¬Όλ € λ°›μ•„μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” νŠΉμ • 객체의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œμ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ ν•΄λ‹Ή 객체에 μ ‘κ·Όν•˜λ €λŠ” ν”„λ‘œνΌν‹° λ˜λŠ” λ©”μ†Œλ“œκ°€ μ—†λ‹€λ©΄ [[Prototype]]이 κ°€λ¦¬ν‚€λŠ” 링크λ₯Ό 따라 μžμ‹ μ˜ λΆ€λͺ¨ 역할을 ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 객체의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό μ°¨λ‘€λŒ€λ‘œ κ²€μƒ‰ν•œλ‹€. 이것을 'ν”„λ‘œν† νƒ€μž… 체인'이라 ν•œλ‹€.

var objA = {
    name: "Tom",
    sayHello: function() { console.log("Hello! " + this.name); }
};
var objB = {
    name : "Huck"
};
objB.__proto__ = objA;
var objC = {};
objC.__proto__ = objB;
objC.sayHello(); // "Hello! Huck"

μœ„μ˜ μ½”λ“œμ— λ“±μž₯ν•œ 객체 μ„Έ κ°œλŠ” proto ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•œ μ—°κ²°κ³ λ¦¬λ‘œ λ¬Άμ—¬ μžˆμŒμ„ μ•Œ 수 μžˆλ‹€.


μ§€κΈˆκΉŒμ§€ ν”„λ‘œν† νƒ€μž… 상속에 κ΄€ν•΄ μ„€λͺ…ν–ˆμ§€λ§Œ μ‹€μ œλ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•ŒλŠ” proto ν”„λ‘œνΌν‹° 값을 직접 μž…λ ₯ν•΄μ„œ μƒμ†ν•˜μ§€ μ•ŠλŠ”λ‹€!

일반적으둜 λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ μƒμ†ν•œλ‹€.

  • μƒμ„±μžλ‘œ 객체λ₯Ό 생성할 λ•Œ μƒμ„±μžμ˜ prototype ν”„λ‘œνΌν‹°μ— μΆ”κ°€ν•˜λŠ” 방법
  • Object.create λ©”μ„œλ“œλ‘œ 상속을 받을 ν”„λ‘œν† νƒ€μž…μ„ μ§€μ •ν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법

ν”„λ‘œν† νƒ€μž… κ°€μ Έμ˜€κΈ°

  • 객체의 ν”„λ‘œν† νƒ€μž…μ€ Object.getPrototypeOf λ©”μ„œλ“œλ‘œ κ°€μ Έμ˜¬ 수 μžˆλ‹€. (λ¬Όλ‘  μ§€μ›ν•˜λŠ” μ›ΉλΈŒλΌμš°μ €μ—μ„œλŠ” obj.__proto__λ‘œλ„ ν”„λ‘œν† νƒ€μž…μ„ κ°€μ Έμ˜¬ 수 μžˆλ‹€.)
function F() {}
var obj = new F();
console.log(Object.getPrototypeOf(obj)); // Object {}

new μ—°μ‚°μžμ™€ μƒμ„±μž ν•¨μˆ˜

  • μœ μ‚¬ν•œ 객체 μ—¬λŸ¬ 개λ₯Ό μ‰½κ²Œ λ§Œλ“€ λ•Œ new μ—°μ‚°μžμ™€ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

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

  • μƒμ„±μž ν•¨μˆ˜(constructor function)와 일반 ν•¨μˆ˜μ— 기술적인 μ°¨μ΄λŠ” μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ μƒμ„±μž ν•¨μˆ˜λŠ” μ•„λž˜ 두 'κ΄€λ‘€'λ₯Ό λ”°λ₯Έλ‹€.
  1. ν•¨μˆ˜ μ΄λ¦„μ˜ 첫 κΈ€μžλŠ” λŒ€λ¬Έμžλ‘œ μ‹œμž‘
  2. λ°˜λ“œμ‹œ 'new' μ—°μ‚°μžλ₯Ό λΆ™μ—¬ μ‹€ν–‰

잠깐! λͺ¨λ“  ν•¨μˆ˜λŠ” μƒμ„±μž ν•¨μˆ˜κ°€ 될 수 μžˆλ‹€λŠ” 점을 μžŠμ§€ 말자. newλ₯Ό λΆ™μ—¬ μ‹€ν–‰ν•œλ‹€λ©΄ μ–΄λ–€ ν•¨μˆ˜λΌλ„ μœ„μ™€ 같이 μ•Œκ³ λ¦¬μ¦˜μ΄ μž‘λ™λœλ‹€. μ΄λ¦„μ˜ 'μ²«κΈ€μžκ°€ λŒ€λ¬ΈμžμΈ' μƒμ„±μž ν•¨μˆ˜λŠ” newλ₯Ό λΆ™μ—¬ μ‹€ν–‰ν•œλ‹€λŠ” 것은 κ³΅λ™μ˜ 약속, 관둀일 뿐이닀.

function User(name) {
  this.name = name;    // thisλŠ” λ°”λ‘œ μƒμ„±μž ν•¨μˆ˜ μžμ‹ μ„ 가리킨닀. μ΄λ ‡κ²Œ this에 μ €μž₯된 것듀은 newλ₯Ό 톡해 객체λ₯Ό λ§Œλ“€ λ•Œ κ·Έ 객체에 μ μš©λœλ‹€.
  this.isAdmin = false;
}

let user = new User("보라");

alert(user.name); // 보라
alert(user.isAdmin); // false

❓ μƒμ„±μžλ₯Ό new μ—°μ‚°μžλ‘œ ν˜ΈμΆœν•΄μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–€ μž‘μ—…μ„ ν• κΉŒ?

μœ„μ˜ μ½”λ“œ new User(...)λ₯Ό μ¨μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ 같이 μ•Œκ³ λ¦¬μ¦˜μ΄ μž‘λ™ν•œλ‹€.

  1. 빈 객체λ₯Ό λ§Œλ“€μ–΄ this에 ν• λ‹Ήν•œλ‹€.
  2. μƒμ„±μžμ˜ prototype ν”„λ‘œνΌν‹° 값을 μƒμ„±λœ 객체의 proto ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ λŒ€μž…. (이 λ•Œ, μƒμ„±μžμ˜ prototype ν”„λ‘œνΌν‹° 값이 객체가 μ•„λ‹ˆλ©΄ Obejct.prototype을 ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ„€μ •)
  3. ν•¨μˆ˜ 본문을 μ‹€ν–‰ν•œλ‹€. this에 μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•΄ thisλ₯Ό μˆ˜μ •ν•œλ‹€.(객체의 μ΄ˆκΈ°ν™”)
  4. thisλ₯Ό λ°˜ν™˜ν•œλ‹€.
function User(name) {
  // this = {};  (빈 객체가 μ•”μ‹œμ μœΌλ‘œ λ§Œλ“€μ–΄μ§€κ³ )
  
  // this.__proto__ = User.prototype (μƒμ„±μžμ˜ prototype ν”„λ‘œνΌν‹°λ₯Ό μƒμ„±λœ 객체의 ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ„€μ •)
  
  // μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹°λ₯Ό this에 좔가함 (객체의 μ΄ˆκΈ°ν™”)
  this.name = name;
  this.isAdmin = false;

  // return this;  (thisκ°€ μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜λ¨)
}

πŸ“Œ 2λ²ˆμ—μ„œ μƒμ„±μžμ˜ prototype ν”„λ‘œνΌν‹° 값을 μƒμ„±λœ 객체의 proto ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ λŒ€μž…ν•˜λŠ” 뢀뢄을 μ£Όλͺ©ν•˜μž!

이λ₯Ό μ΄μš©ν•΄ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž… 체인이 μ •μ˜λ˜λ©°, μƒμ„±μžλ‘œ μƒμ„±ν•œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž… 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  수 있게 λ˜λŠ” 것이닀.