objekt - Kako i zašto koristiti hasOwnProperty u JavaScriptu?


Razmotrite:

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

Koja je ispravna upotreba/objašnjenje hasOwnProperty('someProperty')?

Zašto jednostavno ne možemo koristiti someVar.someProperty da provjerimo sadrži li objekt someVar svojstvo s imenom someProperty?

Što je u ovom slučaju nekretnina?

Koje svojstvo provjerava ovaj JavaScript?

Odgovor #1

hasOwnProperty vraća logičku vrijednost koja označava ima li objekt na kojem ga pozivate svojstvo s nazivom argumenta. Na primjer:

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

Međutim, ne gleda lanac prototipova objekta.

Korisno je koristiti ga kada nabrajate svojstva objekta pomoću konstrukta for...in.

Ako želite vidjeti sve detalje, ES5 specifikacija je, kao i uvijek, dobro mjesto za pogledati.

Odgovor #2

Evo kratak i precizan odgovor:

U JavaScriptu, svaki objekt ima hrpu ugrađenih parova ključ-vrijednost koji sadrže meta informacije o objektu. Kada prolaziš kroz sve parove ključ-vrijednost koristeći for...in konstrukciju/petlju za objekt, prolaziš i kroz ove parove ključ-vrijednost s meta informacijama (što definitivno ne želiš).

Korištenjem hasOwnProperty(property) isključuje se ovo nepotrebno petljanje kroz meta informacije i izravno provjerava je li parametar property svojstvo koje je korisnik dao u objektu ili nije. Pod isključuje se mislim na to da hasOwnProperty(property) ne provjerava postoji li property u prototipskom lancu objekta, tj. meta informacijama.

Vraća boolean true/false na temelju toga.

Evo primjera:

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

Nadam se da je jasno!

Odgovor #3

Sažetak :

hasOwnProperty() je funkcija koja se može pozvati na bilo kojem objektu i prima string kao ulaz. Vraća boolean vrijednost koja je true ako se svojstvo nalazi na objektu, inače vraća false. hasOwnProperty() se nalazi na Object.prototype i stoga je dostupna za bilo koji objekt.

Primjer :

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

U ovom primjeru stvara se novi objekt Person. Svaka osoba ima svoje ime koje se inicijalizira u konstruktoru. Međutim, dob se ne nalazi na objektu nego na prototipu objekta. Stoga hasOwnProperty() vraća true za ime i false za dob.

Praktične primjene:

hasOwnProperty() može biti vrlo korisno kada se petlja kroz objekt koristeći for in petlju. Njime možete provjeriti jesu li svojstva iz samog objekta, a ne iz prototipa. Na primjer:

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]);
  }
}

Odgovor #4

Provjerava:

Vraća vrijednost tipa Boolean koja pokazuje ima li objekt svojstvo s navedenim nazivom

Metoda hasOwnProperty vraća true ako objekt ima svojstvo određenog imena, a false ako ga nema. Ova metoda ne provjerava postoji li svojstvo u lancu prototipa objekta; svojstvo mora biti član samog objekta.

Primjer:

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

Povezani članci