objekt - Hvordan og hvorfor bruke hasOwnProperty i JavaScript?


Vurder:

if (someVar.hasOwnProperty('someProperty') ) {
 // Do something();
} else {
 // Do somethingElse();
}

Hva er riktig bruk/forklaring av hasOwnProperty('someProperty')?

Hvorfor kan vi ikke bare bruke someVar.someProperty for å sjekke om et objekt someVar inneholder en egenskap med navnet someProperty?

Hva er en eiendom i dette tilfellet?

Hvilken egenskap sjekker denne JavaScripten?

Svar #1

hasOwnProperty returnerer en boolsk verdi som indikerer om objektet du kaller det på har en egenskap med navnet til argumentet. For eksempel:

var x = {
    y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false

Imidlertid ser den ikke på prototypekjeden til objektet.

Det er nyttig å bruke det når du oppregner egenskapene til et objekt med for...in-konstruksjonen.

Hvis du vil se alle detaljene, er ES5-spesifikasjonen, som alltid, et godt sted å se.

Svar #2

Her er et kort og presist svar:

I JavaScript har hvert objekt en mengde innebygde nøkkel-verdi-par som har metainformasjon om objektet. Når du går gjennom alle nøkkel-verdi-parene ved hjelp av for...in-konstruksjonen/løkka for et objekt, går du også gjennom disse nøkkel-verdi-parene med metainformasjon (noe du absolutt ikke ønsker).

Ved å bruke hasOwnProperty(property) filtreres disse unødvendige løkkene gjennom metainformasjon ut, og sjekker direkte om parameteren property er en egenskap gitt av brukeren i objektet eller ikke. Med filtreres mener jeg at hasOwnProperty(property) ikke ser om property eksisterer i objektets prototykjede, også kalt metainformasjon.

Det returnerer boolean true/false basert på det.

Her er et eksempel:

var fruitObject = {"name": "Apple", "shape": "round", "taste": "sweet"};
console.log(fruitObject.hasOwnProperty("name"));  //true
console.log(Object.prototype.hasOwnProperty("toString")) // true because in above snapshot you can see, that there is a function toString in meta-information

Jeg håper det er klart!

Svar #3

Sammendrag :

hasOwnProperty() er en funksjon som kan kalles på hvilket som helst objekt og tar en streng som input. Den returnerer en boolsk verdi som er true hvis egenskapen finnes på objektet, ellers returnerer den false. hasOwnProperty() er plassert på Object.prototype og er derfor tilgjengelig for alle objekter.

Eksempel :

function Person(name) {
  this.name = name;
}

Person.prototype.age = 25;

const willem = new Person('willem');

console.log(willem.name); // Property found on object
console.log(willem.age); // Property found on prototype

console.log(willem.hasOwnProperty('name')); // 'name' is on the object itself
console.log(willem.hasOwnProperty('age')); // 'age' is not on the object itself

I dette eksempelet opprettes et nytt Person-objekt. Hver Person har sitt eget navn som blir initialisert i konstruktøren. Alderen derimot finnes ikke på objektet, men på objektets prototype. Derfor vil hasOwnProperty() returnere true for navn og false for alder.

Praktiske anvendelser:

hasOwnProperty() kan være veldig nyttig når man går gjennom et objekt med en for in-løkke. Du kan sjekke med den om egenskapene kommer fra objektet selv og ikke fra prototypen. For eksempel:

function Person(name, city) {
  this.name = name;
  this.city = city;
}

Person.prototype.age = 25;

const willem = new Person('Willem', 'Groningen');

for (let trait in willem) {
  console.log(trait, willem[trait]); // This loops through all properties, including the prototype
}

console.log('\n');

for (let trait in willem) {
  if (willem.hasOwnProperty(trait)) { // This loops only through 'own' properties of the object
    console.log(trait, willem[trait]);
  }
}

Svar #4

Den sjekker:

Returnerer en boolsk verdi som indikerer om et objekt har en egenskap med det angitte navnet

Metoden hasOwnProperty returnerer true hvis objektet har en egenskap med det spesifiserte navnet, false hvis det ikke gjør det. Denne metoden sjekker ikke om egenskapen finnes i objektets prototypekjede; egenskapen må være et medlem av selve objektet.

Eksempel:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true

Relaterte artikler