Skip to content

Latest commit

Β 

History

History
150 lines (103 loc) Β· 4.17 KB

objectcreate-and-objectassign.md

File metadata and controls

150 lines (103 loc) Β· 4.17 KB

Object.create and Object assign

Object.create()

Object.create()λŠ”Β ES5μ—μ„œ λ„μž…λ˜μ—ˆμœΌλ©°, μ§€μ •λœ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“œλŠ” λ©”μ†Œλ“œμ΄λ‹€.

μƒˆλ‘œ μƒμ„±λœ κ°μ²΄λŠ” λͺ¨λ“  ν”„λ‘œν† νƒ€μž… 객체 ν”„λ‘œνΌν‹°λ₯Ό μƒμ†ν•œλ‹€.

// const newObject = Object.create(prototype)

const animal = {}
const dog = Object.create(animal)

두 번째 νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•΄ ν”„λ‘œν† νƒ€μž…μ— μ—†λŠ” μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹°λ₯Ό 객체에 μΆ”κ°€ ν•  수 μžˆλ‹€.

// const newObject = Object.create(prototype, newProperties)

const animal = {}
const dog = Object.create(animal, {
  breed: {
    value: 'Siberian Husky'
  }
});

console.log(dog.breed) //'Siberian Husky'

μ•„λž˜Β μ½”λ“œλŠ” Object.create() λ©”μ†Œλ“œλ₯ΌΒ μ‚¬μš©ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ˜ˆμ œμ΄λ‹€.

var dog = { 
    eat: function () { 
        console.log (this.eatFood) 
    } 
}; 

var maddie = Object.create(dog); 

console.log (dog.isPrototypeOf(maddie)); // true 

maddie.eatFood = 'NyamNaym'; 
maddie.eat(); // NyamNaym
  1. eat λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆλŠ” dog 객체 μƒμ„±ν•œλ‹€.
  2. Object.create(dog)을 μ‚¬μš©ν•΄ maddieλ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  dog의 ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ„€μ •λœ μƒˆλ‘œμš΄ μ™„μ „νžˆ μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“ λ‹€.
  3. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 체인을 톡해 dogμ—μ„œ eat λ©”μ†Œλ“œλ₯Ό μ°Ύμ•„λ‚΄κ³  thisλ₯Ό maddie둜 μ„€μ •ν•œλ‹€.
  4. Object.create()λŠ” ν”„λ‘œν† νƒ€μž…μ΄ dog둜 μ„€μ •λœ maddieλ₯Ό μƒˆλ‘­κ²Œ λ§Œλ“€μ—ˆμœΌλ―€λ‘œ maddie κ°μ²΄λŠ” dog의 λ©”μ†Œλ“œμ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

μ•„λž˜Β μ½”λ“œλŠ” new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ˜ˆμ œμ΄λ‹€.

var Dog = function(){
    this.eatFood = 'NyamNyam';
    this.eat = function(){
        console.log(this.eatFood)
    }
};J

var maddie = new(Dog);

console.log(maddie instanceof Dog); // True

maddie.eat(); // NyamNyam
  1. maddieλΌλŠ” μƒˆλ‘œμš΄ 객체λ₯Ό new μ—°μ‚°μžλ‘œ μƒμ„±ν•˜λ©° maddieλŠ” μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž…μ„ μƒμ†ν•œλ‹€.
  2. μƒμ„±λœ 객체둜 this μ„€μ •λ˜κ³  constructorκ°€ μ‹€ν–‰λœλ‹€.
  3. μƒμ„±λœ 객체가 λ°˜ν™˜λœλ‹€. (constructorκ°€ 객체λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šμ€ 경우)

The difference with Object.create() and new operator

function Dog(){
    this.pupper = 'Pupper';
};

Dog.prototype.pupperino = 'Pups.';
var maddie = new Dog();
var buddy = Object.create(Dog.prototype);

// Object.create()λ₯Ό μ‚¬μš©ν•œ 객체 생성
console.log(buddy.pupper); // ***, undefined
console.log(buddy.pupperino); // Pups.

// new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ 객체 생성
console.log(maddie.pupper); // Pupper
console.log(maddie.pupperino); // Pups.

new μ—°μ‚°μžλ‘œ μƒμ„±λœ maddieλŠ” μƒμ„±μž μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ§€λ§Œ Object.create()λ₯Ό μ‚¬μš©ν•΄ μƒμ„±λœ buddyλŠ” μƒμ„±μž μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ”°λΌμ„œ buddyλŠ” μƒμ„±μžμ—μ„œ this.pupper에 μ ‘κ·Ό ν•  수 μ—†μ–΄ buddy.pupperλŠ” undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€(***).



Object.assign()

Objcet.assgin()은 ES6μ—μ„œ λ„μž…λ˜μ—ˆμœΌλ©°, ν•˜λ‚˜ μ΄μƒμ˜ 객체의 μ—΄κ±° κ°€λŠ₯ν•œ(enumerable) ν”„λ‘œνΌν‹°λ₯Ό λ‹€λ₯Έ 객체둜 λ³΅μ‚¬ν•˜λŠ” λ©”μ†Œλ“œμ΄λ‹€.

const copied = Object.assign({}, original);

κ°’ 볡제 및 객체 μ°Έμ‘°κ°€ λ³΅μ‚¬λ˜λŠ” 얕은 볡사(shallow copy)μ΄λ―€λ‘œ 원본 객체의 ν”„λ‘œνΌν‹°λ₯Ό μˆ˜μ •ν•˜λ©΄ λ³΅μ‚¬λœ 객체의 ν”„λ‘œνΌν‹° λ˜ν•œ λ³€κ²½λœλ‹€.

const original = {
  name: 'toyota',
  car: {
    color: 'black'
  }
}

const copied = Object.assign({}, original);

copied.name // toyota
copied.color // black

// 원본 객체 ν”„λ‘œνΌν‹° μˆ˜μ •
original.name = 'bmw'
original.car.color = 'white'

copied.name // bmw
copied.car.color // white
// 얕은 λ³΅μ‚¬μ΄λ―€λ‘œ copied의 ν”„λ‘œνΌν‹° λ˜ν•œ 변경됨



Reference