Qu'est-ce que la propriété hasOwnProperty en JavaScript?


97

Considérer:

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

Quelle est la bonne utilisation / explication de hasOwnProperty('someProperty')?

Pourquoi ne pouvons-nous pas simplement utiliser someVar.somePropertypour vérifier si un objet someVarcontient une propriété avec un nom someProperty?

Qu'est-ce qu'une propriété dans ce cas?

Quelle propriété ce JavaScript vérifie-t-il?



Quand j'ai posé cette question, j'ai pensé que c'était une fonction qui vérifiait du HTML. Maintenant, je le vois vérifier un objet ou une méthode javascript pour une «variable» dans cet objet ou cette méthode. thnx!
VOL le

Réponses:


165

hasOwnPropertyrenvoie une valeur booléenne indiquant si l'objet sur lequel vous l'appelez possède une propriété avec le nom de l'argument. Par exemple:

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

Cependant, il ne regarde pas la chaîne prototype de l'objet.

Il est utile de l'utiliser lorsque vous énumérez les propriétés d'un objet avec la for...inconstruction.

Si vous voulez voir tous les détails, la spécification ES5 est, comme toujours, un bon endroit pour regarder.


6
Points bonus pour la chaîne de prototypes. Toujours essayer de comprendre ce que l'appelant lorsque son pas appelé sur un objet ... sa nonwindow
Kristoffer SalI-Storgaard

@KristofferSHansen - Je me posais la question aussi, mais la question a été modifiée, elle est maintenant appelée sur un objet. Quand ce n'est pas le cas, une erreur est générée.
James Allardice

Je suppose que cela change les choses. Aucune erreur lors de l'exécution à partir de la console dans Chrome.
Kristoffer Sall-Storgaard

@KristofferSHansen - Je pense que c'est à cause de la façon dont la console exécute le code (elle est exécutée sous forme de evalcode plutôt que de code global ou de fonction). Je l'ai essayé dans une page HTML vierge et j'obtiens une erreur "impossible de convertir null en objet".
James Allardice

@KristofferSHansen voit la réponse de Kunal Vashist quand il est appelé sur une méthode de classe
FLY

25

Voici une réponse courte et précise:

En JavaScript, chaque objet possède un ensemble de paires clé-valeur intégrées contenant des méta-informations sur l'objet. Lorsque vous parcourez toutes les paires clé-valeur en utilisant la for...inconstruction / boucle pour un objet, vous parcourez également ces paires clé-valeur de méta-informations (ce que vous ne voulez certainement pas).

Entrez la description de l'image ici

En utilisant des hasOwnPropery(property) filtres, ces boucles inutiles dans les méta-informations et vérifient directement que le paramètre propertyest une propriété donnée par l'utilisateur dans l'objet ou non. Par filtrage , je veux dire, cela hasOwnProperty(property)ne regarde pas si, propertyexiste dans la chaîne de prototypes d'Object, autrement dit les méta-informations.

Il renvoie un booléen true/falsebasé sur cela.

Voici un exemple:

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

J'espère que c'est clair!


à la dernière ligne de votre exemple que vous écrivez console.log(Object.prototype....; vouliez-vous dire console.log(fruitObject.? fruitObject ou Object?
Hamid Araghi

> "vous parcourez également ces paires clé-valeur de méta-informations" Mais quand je lance for (var key in fruitObject) { ... }js uniquement des clés non prototypes de toute façon, est-ce que je manque quelque chose ou est-ce que le runtime JS a changé la façon dont ils traitent les objets à saisir boucles?
ChickenFeet

13

Il vérifie:

Renvoie une valeur booléenne indiquant si un objet a une propriété avec le nom spécifié

Le hasOwnProperty méthode renvoie true si l'objet a une propriété du nom spécifié, false dans le cas contraire. Cette méthode ne vérifie pas si la propriété existe dans la chaîne de prototypes de l'objet; la propriété doit être membre de l'objet lui-même.

Exemple:

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

2
J'ai donné un -1 parce que votre réponse initiale était une phrase courte et totalement incohérente, qui a ensuite été mise à jour en une phrase légèrement plus longue, légèrement plus cohérente, mais totalement inexacte.

@ amnotiam- mais je pense que c'est beaucoup plus clair maintenant ... c'est parce que mon problème Internet je ne peux pas en publier plus ..........
Pranay Rana

12

Sommaire:

hasOwnProperty()est une fonction qui peut être appelée sur n'importe quel objet et prend une chaîne comme entrée. Il renvoie un booléen qui est truesi la propriété est située sur l'objet, sinon il retourne false. hasOwnProperty()est situé sur Object.prototypeet donc disponible pour tout objet.

Exemple:

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

Dans cet exemple, un nouvel objet Personne est créé. Chaque personne a son propre nom qui est initialisé dans le constructeur. Cependant, l'âge ne se situe pas sur l'objet mais sur le prototype de l'objet. Par conséquent hasOwnProperty()revient truepour le nom et falsepour l'âge.

Applications pratiques:

hasOwnProperty()peut être très utile lors d'une boucle sur un objet à l'aide d'une for inboucle. Vous pouvez vérifier avec lui si les propriétés proviennent de l'objet lui-même et non du prototype. Par exemple:

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


3

Vous utilisez object.hasOwnProperty ( p ) pour déterminer si un objet a une propriété énumérable p -

Un objet peut avoir son propre prototype, où des méthodes et des attributs «par défaut» sont attribués à chaque instance de l'objet. hasOwnProperty renvoie true uniquement pour les propriétés spécifiquement définies dans le constructeur ou ajoutées ultérieurement à l'instance.

Pour déterminer si p est défini du tout, n'importe où, pour l'objet, utilisez if ( p instanceof object), où p s'évalue en une chaîne de nom de propriété.

Par exemple, par défaut, tous les objets ont une méthode 'toString', mais elle n'apparaîtra pas dans hasOwnProperty.


2

hasOwnProperty est une fonction JavaScript normale qui prend un argument de chaîne.

Dans votre cas, somevar.hasOwnProperty('someProperty')il vérifie que la somevarfonction a someproperyou non - il renvoie vrai et faux.

Dire

function somevar() {
    this.someProperty = "Generic";
}

function welcomeMessage()
{
    var somevar1 = new somevar();
    if(somevar1.hasOwnProperty("name"))
    {
        alert(somevar1.hasOwnProperty("name")); // It will return true
    }
}

2

hasOwnPropertyest une bonne façon de vérifier qu'un objet a une propriété ou non. someVar.somePropertyne peut pas être utilisé comme alternative à cette situation. La condition suivante montrera une bonne différence:

const someVar = { isFirst: false };


// The condition is true, because 'someVar' has property 'isFirst'
if (someVar.hasOwnProperty('isFirst')) {
  // Code runs
}


// The condition is false, because 'isFirst' is false.
if (someVar.isFirst) {
  // Code does not runs here
}

Par conséquent, someVar.isFirstne peut pas être utilisé comme alternative à someVar.hasOwnProperty('isFirst').


-1

Scène A:

const objA = { a: 1, b: 2 }
for (const key in objA) {
  if (objA.hasOwnProperty(key)) {
    console.log(objA[key])
  }
}

    Output

    1
    2

Scène B:

const objB = {
  a: 1,
  b: 2,
  hasOwnProperty() {
    return false
  }
}

for (const key in objB) {
  if (objB.hasOwnProperty(key)) {
    console.log(objB[key])
  }
}

    Outputs nothing

Parce que JavaScript ne protège pas la propriété de hasOwnProperty. Vous pouvez donc l'utiliser comme ceci:

for (const key in objB) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    console.log(objB[key])
  }
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.