non prototype Object.create(null) 과 {} 객체 생성 방식 차이점

agnusdei·2023년 7월 11일
0

Object.create(null)과 빈 객체 리터럴인 {}를 사용하여 객체를 생성하는 방식에는 몇 가지 차이가 있습니다. 다음은 각 방식의 차이점을 자세히 설명하겠습니다.

  1. 프로토타입 체인:

    • {} 방식: 빈 객체 리터럴을 사용하여 객체를 생성하면, 이 객체의 프로토타입은 Object.prototype이 됩니다. 이는 JavaScript에서 일반적인 객체 생성 방식입니다.
    • Object.create(null) 방식: null을 프로토타입으로 갖는 객체를 생성합니다. 이 경우, 생성된 객체는 프로토타입 체인 상에서 어떠한 상위 프로토타입도 갖지 않습니다. 따라서 생성된 객체는 Object.prototype의 메서드나 속성을 상속받지 않습니다.
  2. 속성 상속:

    • {} 방식: 빈 객체 리터럴로 생성된 객체는 Object.prototype의 속성들을 상속받습니다. 예를 들어, toString()이나 hasOwnProperty()과 같은 메서드를 사용할 수 있습니다.
    • Object.create(null) 방식: null을 프로토타입으로 갖는 객체는 Object.prototype의 속성을 상속받지 않습니다. 따라서 toString()이나 hasOwnProperty()과 같은 메서드를 사용할 수 없습니다.
  3. 프로퍼티 속성:

    • {} 방식: 빈 객체 리터럴로 생성된 객체에는 [[Prototype]]이라는 내부 슬롯이 존재합니다. 이 슬롯은 객체의 프로토타입에 대한 참조를 가지고 있습니다. 또한, [[Enumerable]], [[Configurable]], [[Writable]]과 같은 속성 속성을 갖는 프로퍼티를 추가할 수 있습니다.
    • Object.create(null) 방식: null을 프로토타입으로 갖는 객체는 [[Prototype]]이 존재하지 않습니다. 따라서 프로퍼티 속성을 추가할 때 프로토타입 체인에 영향을 주지 않습니다. 이 방식으로 생성된 객체는 일반적인 객체처럼 동작하지만, 프로토타입 체인이 없기 때문에 속성을 검색할 때 더 빠른 성능을 제공할 수 있습니다.
  4. 충돌 가능성:

    • {} 방식: {}를 사용하여 객체를 생성할 때, 객체에 이미 존재하는 속성 이름을 사용하면 이전 값을 덮어씁니다. 이는 Object.prototype의 메서드나 속성을 덮어쓰는 경우에도 마찬가지입니다.
    • Object.create(null) 방식: null을 프로토타입으로 갖는 객체는 상위 프로토타입이 없기 때문에 충돌 가능성이 적습니다. 즉, 객체에 이미 존재하는 속성 이름을 사용해도 다른 객체와 충돌하지 않습니다.

위의 차이점들은 Object.create(null)을 사용하는 경우에 유용한 상황을 고려할 때 중요해집니다. 일반적으로 프로토타입 체인과 Object.prototype의 메서드와 속성을 활용해야 하는 경우에는 빈 객체 리터럴인 {}를 사용하는 것이 적합합니다. 그러나 상속 및 프로토타입 체인을 제외하고 순수한 데이터 저장용 객체를 생성하고자 하는 경우에는 Object.create(null)을 사용하여 객체를 생성할 수 있습니다.

0개의 댓글