¿Qué es la propiedad en hasOwnProperty en JavaScript?


97

Considerar:

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

¿Cuál es el uso / explicación correcto de hasOwnProperty('someProperty')?

¿Por qué no podemos simplemente usar someVar.somePropertypara verificar si un objeto someVarcontiene una propiedad con nombre someProperty?

¿Qué es una propiedad en este caso?

¿Qué propiedad comprueba este JavaScript?



Cuando hice esta pregunta, pensé que era una función que verificaba algunos html. Ahora lo veo verificando un objeto o método javascript para una 'variable' dentro de ese objeto o método. gracias!
VUELO

Respuestas:


165

hasOwnPropertydevuelve un valor booleano que indica si el objeto al que lo está llamando tiene una propiedad con el nombre del argumento. Por ejemplo:

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

Sin embargo, no mira la cadena de prototipos del objeto.

Es útil usarlo cuando enumera las propiedades de un objeto con la for...inconstrucción.

Si desea ver todos los detalles, la especificación ES5 es, como siempre, un buen lugar para buscar.


6
Puntos de bonificación por cadena de prototipos. Todavía estoy tratando de averiguar a qué se llama cuando no se llama a un objeto ... no lo eswindow
Kristoffer Sall-Storgaard

@KristofferSHansen: yo también me preguntaba eso, pero la pregunta se ha editado, por lo que ahora se llama a un objeto. Cuando no lo es, se lanza un error.
James Allardice

Supongo que eso cambia las cosas. Sin embargo, no hay error cuando se ejecuta desde la consola en Chrome.
Kristoffer Sall-Storgaard

@KristofferSHansen: creo que eso se debe a la forma en que la consola ejecuta el código (se ejecuta como evalcódigo en lugar de código global o de función). Lo probé en una página HTML en blanco y obtuve el error "No se puede convertir nulo en objeto".
James Allardice

@KristofferSHansen ve la respuesta de Kunal Vashist cuando se la llama en un método de clase
FLY

25

Aquí hay una respuesta breve y precisa:

En JavaScript, cada objeto tiene un montón de pares clave-valor integrados que tienen metainformación sobre el objeto. Cuando recorre todos los pares clave-valor usando for...inconstruct / loop para un objeto, también está recorriendo estos pares clave-valor de metainformación (lo que definitivamente no desea).

Ingrese la descripción de la imagen aquí

El uso de hasOwnPropery(property) filtros elimina estos bucles innecesarios a través de la metainformación y comprueba directamente si el parámetro propertyes una propiedad dada por el usuario en el objeto o no. Por filtros de salida , quiero decir, que hasOwnProperty(property)no se ve si propertyexiste en la cadena de prototipos de Object, también conocida como metainformación.

Devuelve booleano true/falsebasado en eso.

Aquí hay un ejemplo:

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

¡Espero que esté claro!


en la última línea de su ejemplo escribe console.log(Object.prototype....; ¿te refieres console.log(fruitObject.? fruitObject u Object?
Hamid Araghi

> "también estás recorriendo estos pares clave-valor de metainformación" Pero cuando ejecuto for (var key in fruitObject) { ... }js solo ciclo a través de claves no prototipo de todos modos, ¿me falta algo o el tiempo de ejecución de JS cambió la forma en que manejan la clave en el objeto bucles?
ChickenFeet

13

Comprueba:

Devuelve un valor booleano que indica si un objeto tiene una propiedad con el nombre especificado

El método hasOwnProperty devuelve verdadero si el objeto tiene una propiedad del nombre especificado, falso si no la tiene. Este método no comprueba si la propiedad existe en la cadena de prototipos del objeto; la propiedad debe ser miembro del propio objeto.

Ejemplo:

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

2
Di un -1 porque su respuesta inicial fue una oración corta y completamente incoherente, que luego se actualizó a una oración un poco más larga, un poco más coherente, pero completamente inexacta.

@ amnotiam- pero creo que está muy claro ahora ... es porque mi problema de Internet no puedo publicar más ..........
Pranay Rana

12

Resumen:

hasOwnProperty()es una función que se puede llamar en cualquier objeto y toma una cadena como entrada. Devuelve un booleano que es truesi la propiedad está ubicada en el objeto, de lo contrario, devuelve falso. hasOwnProperty()está ubicado Object.prototypey, por lo tanto, disponible para cualquier objeto.

Ejemplo:

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

En este ejemplo, se crea un nuevo objeto Persona. Cada persona tiene su propio nombre que se inicializa en el constructor. Sin embargo, la edad no se ubica en el objeto sino en el prototipo del objeto. Por tanto hasOwnProperty(), vuelve truepor nombre y falsepor edad.

Aplicaciones prácticas:

hasOwnProperty()puede ser muy útil cuando se realiza un bucle sobre un objeto mediante un for inbucle. Puede verificar con él si las propiedades son del objeto en sí y no del prototipo. Por ejemplo:

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

Utiliza object.hasOwnProperty ( p ) para determinar si un objeto tiene una propiedad enumerable p -

Un objeto puede tener su propio prototipo, donde los métodos y atributos "predeterminados" se asignan a cada instancia del objeto. hasOwnProperty devuelve verdadero solo para las propiedades que se establecieron específicamente en el constructor o que se agregaron a la instancia más tarde.

Para determinar si p está definido en absoluto, en cualquier lugar, para el objeto, use if ( p instancia del objeto), donde p se evalúa como una cadena de nombre de propiedad.

Por ejemplo, de forma predeterminada, todos los objetos tienen un método 'toString', pero no aparecerá en hasOwnProperty.


2

hasOwnProperty es una función JavaScript normal que toma un argumento de cadena.

En su caso, somevar.hasOwnProperty('someProperty')comprueba si la somevarfunción tiene someproperyo no, devuelve verdadero y falso.

Decir

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

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

2

hasOwnPropertyes una forma adecuada de comprobar que un objeto tiene una propiedad o no. someVar.somePropertyno se puede utilizar como alternativa a esta situación. La siguiente condición mostrará una buena diferencia:

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
}

Por someVar.isFirstlo tanto , no se puede utilizar como alternativa a someVar.hasOwnProperty('isFirst').


-1

Escena A:

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

    Output

    1
    2

Escena 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

Porque JavaScript no protege la propiedad de hasOwnProperty. Entonces puedes usarlo así:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.