2012-07-03 10 views

Respuesta

11

Si va a crear un objeto básico con {}, o por contacto de JSON utilizando JSON.Parse, hasOwnProperty es globalmente inútil.

Pero si extiende (utilizando un prototipo) una "clase", entonces le ayuda a saber si está accediendo a sus "propiedades propias" (propiedades directas, incluidas las funciones directas).

Tenga en cuenta que un objeto básico tiene al menos una (no directa) Propiedad, para que puedan descubrir con console.log({}); o console.log({}.toString) pero it's not enumerable and not seen en un bucle for... in:

Un bucle for ... in no iterar sobre propiedades no enumerables. Los objetos creados a partir de constructores incorporados como Array y Object tienen propiedades no enumerables heredadas de Object.prototype y String.prototype que no son enumerables, como el método indexOf de String o el método toString de Object. El ciclo iterará sobre todas las propiedades enumerables del objeto o que hereda de su prototipo del constructor (incluidas las que sobrescriben las propiedades integradas ).

+2

'hasOwnProperty' no es inútil y necesaria cuando no tiene el control total sobre el código de tu pagina. Digamos que alguien modifica 'Object.prototype' como en la respuesta de Cristoph.incluso con un objeto simple obtendrás resultados impredecibles sin 'hasOwnProperty'. – Radu

+0

Diría que el código messing que no tiene control total es una categoría diferente de * crear un objeto básico con {}, o obtenerlo de JSON * –

10

Sin hasOwnProperty usted no sabe si la propiedad es una propiedad nativa de su objeto o heredada de su prototipo.

Your modified fiddle

var obj1 = {a:"10",b:"20"}; 

Object.prototype.c = "prototype:30"; 

var i; 
for(i in obj1) { 
    document.getElementById("div1").innerHTML += obj1[i]+" "; 
} 
// result 10 20 prototype:30 

for(i in obj1) { 
    if(obj1.hasOwnProperty(i)) { 
     document.getElementById("div2").innerHTML += obj1[i] +" "; 
    }   
} 
// result 10 20 
​ 

En este caso obj1 hereda la propiedad c desde su prototipo Object y que le erróneamente incluirla en el primer bucle.

1

A menudo obtendrá el mismo resultado con o sin hasOwnProperty, pero este último ignora las propiedades que se heredan en lugar de vivir directamente en el objeto en cuestión.

Considere este sistema de herencia básico. Los perros heredan de la clase principal de Animal.

function Animal(params) { this.is_animal = true; } 
function Dog(params) { for (var i in params) this[i] = params[i]; } 
Dog.prototype = new Animal(); 
var fido = new Dog({name: 'Fido'}); 

Si nos asomamos en fido, hasOwnProperty nos ayuda a determinar cuáles son sus propias propiedades (nombre) y que son heredadas.

for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]); 

... Alertas name=Fido pero no is_animal=true.

Cuestiones relacionadas