# 객체를 생성하는 다양한 방법을 설명해보세요. 언제 어떤 방법이 선호되나요?

30-Seconds-of-knowledge의 Describe the different ways to create an object. When should certain ways be preferred over others? (opens new window)를 번역한 글입니다.

# Object literal

데이터 저장이 한번만 발생할 때 주로 사용한다.

const person = {
    name: "John",
    age: 50,
    birthday(){
        this.age++
    }
}
person.birthday(); //person.age === 51 (true)

# 생성자 (Constructor)

객체 인스턴스가 서로의 데이터에 영향을 주지 않고 여러번 생성돼야할 때 주로 사용한다. new 연산자는 생성자를 호출하기 전에 사용해야한다. 그렇지 않을 경우 global 객체가 변형된다.

function Person(name, age){
    this.name = name
    this.age = age
}

Person.prototype.birthday = function(){
    this.age++
}

const person1 = new Person("John", 50)
const person2 = new Person("Sally", 20)
person1.birthday() //person1.age === 51 (true)
person2.birthday() //person2.age === 21 (true)

# Factory Function

생성자 방식과 비슷하지만, closure를 이용해 private 데이터를 저장할 수 있다. 또한 new 연산자나 this 키워드가 필요하지 않다. Factory Function은 프로토타입의 idea를 버리고, 모든 프로퍼티와 메소드를 객체의 고유한 속성으로 유지한다.

const createPerson = (name, age) => {
    const birthday = () => person.age++
    const person = {name, age, birthday}
    return person
}
const person = createPerson("John", 50)
person.birthday() //person.age === 51

# 참고

# Object.create()

새로 생성된 객체의 프로토타입을 설정한다.

const personProto = {
    birthday(){
        this.age++
    }
}
const person = Object.create(personProto)
person.age = 50
person.birthday() //person.age === 51

Object.create()의 두번째 argument는 새 속성에 대한 설명자 역할을 한다.

Object.create(personProto, {
    age: {
        value: 50,
        writeable: true,
        enumerable: true
    }
})

# 참고

# 알아두면 좋은 것

  • 프로토타입
  • Factory Function은 closure를 이용해 private한 변수, 메소드를 저장하게 만들지만 메모리의 사용량을 증가시키는 트레이드오프가 존재한다. 반면 클래스들은 이런 기능은 없지만 단일 prototype 객체를 재사용함으로써 메모리에 영향을 잘 받지 않는다.