source

Object.create(null)로 JS 개체를 생성하는 것이 {}과(와) 같습니까?

manysource 2023. 10. 22. 20:10

Object.create(null)로 JS 개체를 생성하는 것이 {}과(와) 같습니까?

저는 JS 객체를 만드는 방법은 많이 알고 있지만 잘 몰랐습니다.Object.create(null).

질문:.

다음과 정확히 같습니까?

var p = {}

var p2 = Object.create(null);

?

그들은 동등하지 않습니다.{}.constructor.prototype == Object.prototype하는 동안에Object.create(null)어떤 것에서도 상속되지 않으므로 속성이 전혀 없습니다.

다시 말해: 다음과 같이 null을 프로토타입으로 명시적으로 생성하지 않는 한 자바스크립트 객체는 기본적으로 Object에서 상속됩니다.Object.create(null).

{}대신에 다음과 동등할 것입니다.Object.create(Object.prototype).


Chrome Devtool에서는 다음을 볼 수 있습니다.Object.create(null)__proto__반면에 재산{}.다입니다.

enter image description here

그들은 절대 동등하지 않습니다.왜 차이가 생기는지 좀 더 자세히 설명해드리기 위해 이 답변을 씁니다.

  1. var p = {};

    속성 및 메서드를 상속하는 개체를 만듭니다.Object.

  2. var p2 = Object.create(null);

    아무것도 상속하지 않는 개체를 만듭니다.

만약 당신이 객체를 지도로 사용하고 있고, 위의 방법 1을 사용하여 객체를 만든다면, 당신은 지도에서 룩업을 할 때 각별히 주의해야 합니다.왜냐하면 그들의 특성과 방법은Object코드가 상속되면 지도에 삽입하지 않은 키가 있는 경우가 발생할 수 있습니다.예를 들어, 다음과 같이 검색한 경우toString, 함수를 찾을 수 있습니다. 비록 그 값을 거기에 두지는 않았지만 말입니다.다음과 같이 해결할 수 있습니다.

if (Object.prototype.hasOwnProperty.call(p, 'toString')) {
    // we actually inserted a 'toString' key into p
}

다음 작업에 할당해도 좋습니다.p.toString, 단순히 상속받은 것을 덮어쓸 뿐입니다.toString기능을 다함p.

당신이 그냥 할 수 없다는 것을 주목하세요.p.hasOwnProperty('toString')키 "hasOwnProperty"를 삽입했을 수도 있기 때문입니다.p, 그래서 우리는 구현을 사용하도록 강요합니다.Object.

반면에 위의 방법 2를 사용한다면, 당신은 걱정할 필요가 없을 것입니다.Object지도에 나타남

단순한 방법으로는 부동산의 존재 여부를 확인할 수 없습니다.if다음과 같이:

// Unreliable:
if (p[someKey]) {
    // ...
}

값이 빈 문자열일 수 있습니다.false, 아니면null, 아니면undefined, 아니면0, 아니면NaN, 부동산이 존재하는지 여부를 확인하려면 여전히 다음을 사용해야 합니다.Object.prototype.hasOwnProperty.call(p, someKey).

를 사용하여 개체 만들기{}프로토타입이 다음과 같은 객체를 생성할 것입니다.Object.prototype에서 기본 기능을 물려받은Object프로토타입(prototype)을 사용하여 객체를 생성하는 동안Object.create(null)프로토타입이 null인 빈 개체를 생성합니다.

만약 누군가가 실행을 찾고 있다면,Object.create(null), 어떻게 작동하는지 알기 위해서 입니다.을 사용하여 작성됩니다.__proto__그건 표준이 아니기 때문에, 는 그것을 추천하지 않습니다.

function objectCreateMimic()
{
  /*optional parameters: prototype_object, own_properties*/
  var P = arguments.length>0?arguments[0]:-1;
  var Q = arguments.length>1?arguments[1]:null;
  var o = {};
  if(P!==null && typeof P === "object")
  {
    o.__proto__ = P;
  }
  else if(P===null)
  {
    o.__proto__ = null;
  }
  if(Q!==null && typeof Q === "object")
  {
   for(var key in Q)
   {
     o[key] = Q[key];
   }
  }
  return o;
}

참고: 이것은 호기심으로 작성한 것으로, 두 번째 개체에서 반환 개체로 속성 설명자를 이전하지 않는 등 간단한 용어로만 작성되어 있습니다.

Object.create(null)로 Object를 생성하면 prototype.null이 없는 Object를 생성하게 됩니다.그러나 {}과(와) 같은 개체를 생성하면 개체 프로토타입이 추가됩니다.따라서 이는 프로토타입이 없는 프로토타입이 있는 두 개의 다른 개체입니다.도움이 되길 바랍니다.

다소 오래된 질문이고 모든 유효한 답변인 것 같지만 @Royi Namir가 얻고 있었을 수도 있고 여기서 이해하는 것이 좋을 수도 있는 것은 그것을 사용해야 한다는 것입니다.질문만 하는 것보다 제가 한 번 봐볼게요.

  • {}단순하고 간단하며 널리 알려진 유비쿼터스 코드입니다.
  • Object.create(null)질문에 대한 단순한 사실만으로 추측할 수 있듯이, 잘 알려지지 않고 자주 사용되지 않습니다.

당신은 왜 사용합니까?Object.create(null)위에{}? 여기에 있는 다른 답변들은 두 접근법들의 차이점을 지적함으로써 그 질문에 대답합니다, 그것은 단지 다음과 같습니다.Object.create(null)이(는) Object.prototype 프로토타입을 상속하지 않습니다.{}네, 그리고 그건 당신의 특정 상황에서 가치가 있을 겁니다.

그 외에도 성능, 메모리 사용 또는 사용 편의성 때문에 하나를 다른 하나로 사용할 수도 있습니다.

개체를 생성하는 데 걸리는 시간을 측정하기 위해 몇 가지 간단한 테스트를 실행하면 실제로 성능과 메모리의 차이가 있다는 것을 알 수 있습니다.참고: 설명을 단순화하기 위해 속성 할당이 포함된 테스트만 보여주고 있지만, 속성 할당 유무와 측정 기준은 비슷합니다.

console.time("create curly");
let objects = [];
for (let i = 0; i < 100000; i++) {
    objects.push({ attr1: i, attr2: i*2, attr3: i*5});
}
console.log(objects.length);
console.timeEnd("create curly");
console.log("Memory", process.memoryUsage().heapUsed);

출력(수회 실행, 최적 시간, 정확하지 않음):

create curly: 24.152ms
Memory 11280760
console.time("create object");
let objects = [];
for (let i = 0; i < 100000; i++) {
    const obj = Object.create(null)
    obj.attr1 = i;
    obj.attr2 = i*2;
    obj.attr3 = i*5;
    objects.push(obj);
}
console.log(objects.length);
console.timeEnd("create object");
console.log("Memory", process.memoryUsage().heapUsed);

출력(수회 실행, 최적 시간, 정확하지 않음):

create object: 41.106ms
Memory 23766400

성능 시간 출력이 완전히 과학적이고 정확한 측정 기준은 아니지만, 이렇게 말하는 것은 꽤 안전하다고 생각합니다.Object.create(null)보다 느림{}해야 하는 으로 큰 수 그러나 생성해야 하는 개체 수에 따라 상대적으로 큰 차이가 없을 수 있습니다.

메모리 표시된 테스트 결과에서 다음을 사용하여 개체를 만듭니다.Object.create(null)그리고 개체에 몇 가지 속성을 할당하는 것은 개체를 생성하는 것보다 약 두 배의 메모리가 필요합니다.{}속성을 인라인으로 지정합니다.10만 개의 객체에 약 10MB가 더 필요합니다.의미심장하네요!

사용 편의성 다음을 쉽게 알 수 있습니다.{}인라인 속성을 사용하면 훨씬 쉽게 사용할 수 있으며 간소화된 속성 할당이 가능합니다.

으로 을 {}Object.prototype 프로토타입을 상속하지 않는 개체를 생성해야 하는 실제 이유가 없다면 성능 향상, 메모리 사용 및 손가락 스트레스 완화를 위해 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/15518328/is-creating-js-object-with-object-createnull-the-same-as