objekt - Hur och varför använda hasOwnProperty i JavaScript?


Överväg:

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

Vad är den korrekta användningen/förklaringen av hasOwnProperty('someProperty')?

Varför kan vi inte helt enkelt använda someVar.someProperty för att kontrollera om ett objekt someVar innehåller en egenskap med namnet someProperty?

Vad är en egenskap i detta fall?

Vilken egenskap kontrollerar detta JavaScript?

Svar #1

hasOwnProperty returnerar ett booleanvärde som anger om objektet på vilket du anropar det har en egenskap med namnet på argumentet. Till exempel:

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

Men det tittar inte på objektets prototypkedja.

Det är användbart att använda det när du räknar upp egenskaperna hos ett objekt med for...in-konstruktionen.

Om du vill se fullständiga detaljer är ES5-specifikationen, som alltid, en bra plats att titta på.

Svar #2

Här är ett kort och precis svar:

I JavaScript har varje objekt en mängd inbyggda nyckel-värde-par som innehåller metainformation om objektet. När du loopar genom alla nyckel-värde-par med hjälp av for...in-konstruktionen/loopen för ett objekt loopar du även genom dessa metainformations-nyckel-värde-par (vilket du definitivt inte vill).

Att använda hasOwnPropery(property) filtrerar bort dessa onödiga loopar genom metainformation och kontrollerar direkt om parametern property är en användarspecificerad egenskap i objektet eller inte. Med filtrerar bort menar jag att hasOwnProperty(property) inte tittar på om property finns i objektets prototypkedja, dvs. metainformation.

Det returnerar boolean true/false baserat på det.

Här är ett exempel:

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

Jag hoppas att det är klart!

Svar #3

Sammanfattning :

hasOwnProperty() är en funktion som kan kallas på vilket objekt som helst och tar en sträng som indata. Den returnerar ett booleanvärde som är true om egenskapen finns på objektet, annars returnerar den false. hasOwnProperty() finns på Object.prototype och är därför tillgänglig för vilket objekt som helst.

Exempel :

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 detta exempel skapas ett nytt Person-objekt. Varje Person har sitt eget namn som initieras i konstruktören. Åldern finns däremot inte på objektet utan på objektets prototyp. Därför returnerar hasOwnProperty() true för namn och false för ålder.

Praktiska tillämpningar:

hasOwnProperty() kan vara mycket användbart när man loopar över ett objekt med en for in-loop. Man kan använda det för att kontrollera om egenskaperna kommer från objektet själv och inte från prototypen. Till exempel:

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 kontrollerar:

Returnerar ett Boolean-värde som anger om ett objekt har en egenskap med det angivna namnet

Metoden hasOwnProperty returnerar true om objektet har en egenskap med det angivna namnet, och false om det inte har det. Denna metod kontrollerar inte om egenskapen finns i objektets prototypkedja; egenskapen måste vara en medlem av objektet själv.

Exempel:

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

Relaterade artiklar