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__
반면에 재산{}
.다입니다.
그들은 절대 동등하지 않습니다.왜 차이가 생기는지 좀 더 자세히 설명해드리기 위해 이 답변을 씁니다.
var p = {};
속성 및 메서드를 상속하는 개체를 만듭니다.
Object
.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
'source' 카테고리의 다른 글
열거(typedef enum)의 중요도 (0) | 2023.10.22 |
---|---|
WooCommerce 3+에서 디버그하는 방법 (0) | 2023.10.22 |
ajax 요청에 crf 토큰을 추가하는 방법 (0) | 2023.10.22 |
Jquery each - 루프를 중지하고 개체를 반환합니다. (0) | 2023.10.22 |
테이블의 항목을 재정렬하는 방법 (0) | 2023.10.22 |