javascript - Er det det samme å lage et JS-objekt med Object.create(null) som {}?


Jeg kjenner mange måter å lage JS-objekter på, men jeg visste ikke om Object.create(null)-måten.

Spørsmål:

er det helt det samme som:

var p = {}

mot

var p2 = Object.create(null);

?

Svar #1

De er ikke ekvivalente. {}.constructor.prototype === Object.prototype mens Object.create(null) ikke arver fra noe som helst og derfor ikke har noen egenskaper i det hele tatt.

Med andre ord: Et JavaScript-objekt arver fra Object som standard, med mindre du eksplisitt oppretter det med null som prototyp, som: Object.create(null).

{} ville i stedet tilsvare Object.create(Object.prototype).


I Chrome DevTools kan du se at Object.create(null) ikke har noen prototype, mens {} har det.

Svar #2

De er definitivt ikke likeverdige. Jeg skriver dette svaret for å forklare mer fullstendig hvorfor det gjør en forskjell.

  1. var p = {};

    Oppretter et objekt som arver egenskapene og metodene fra Object.

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

    Oppretter et objekt som ikke arver noe.

Hvis du bruker et objekt som et kart, og du oppretter et objekt ved å bruke metode 1 ovenfor, må du være ekstra forsiktig når du gjør oppslag i kartet. Fordi egenskapene og metodene fra Object arves, kan koden din støte på et tilfelle der det finnes nøkler i kartet som du aldri har satt inn. For eksempel, hvis du gjorde et oppslag på toString, ville du finne en funksjon, selv om du aldri satte den verdien der. Du kan omgå det på denne måten:

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

Merk at det er greit å tilordne noe til p.toString, det vil rett og slett overstyre den arvede toString-funksjonen på p.

Merk at du ikke bare kan gjøre p.hasOwnProperty('toString') fordi du kanskje har lagt inn en nøkkel "hasOwnProperty" i p, så vi tvinger det til å bruke implementeringen i Object.prototype.

På den annen side, hvis du bruker metode 2 ovenfor, trenger du ikke å bekymre deg for at ting fra Object dukker opp i kartet.

Du kan ikke sjekke om en egenskap eksisterer med en enkel if som dette:

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

Verdien kan være en tom streng, kan være false, eller null, eller undefined, eller 0, eller NaN, osv. For å sjekke om en egenskap eksisterer i det hele tatt, må du fortsatt bruke Object.prototype.hasOwnProperty.call(p, someKey).

Relaterte artikler