El método hasOwnProperty le permite saber si una propiedad está directamente en una instancia de un objeto o se hereda de su cadena de prototipo.
Considere lo siguiente
function ObjWithProto() {
this.foo = 'foo_val';
}
ObjWithProto.prototype = {bar: 'bar_val'};
var dict = new ObjWithProto();
dict.foobar = 'foobar_val';
es decir, que tienen un objeto dict
con propiedades foo
y foobar
que también hereda una propiedad bar
de ella de cadena de prototipo.
Ahora ejecutarlo a través de (una versión modificada de) su código
function forEach(dict) {
var key;
for (key in dict) {
if (dict.hasOwnProperty(key)) console.log('has', key, dict[key]);
else console.log('not', key, dict[key]);
}
}
forEach(dict);
verá
has foo foo_val
has foobar foobar_val
not bar bar_val
Esto le permite propiedades separadas que un objeto tiene en sí y para los que ha heredado (que generalmente son métodos que no son relevantes para el ciclo)
Además, si ahora hace dict.bar = 'new_bar_val';
, el último resultado cambiará a has bar new_bar_val
, lo que le permite distinguir incluso entre las propiedades del mismo nombre que las heredadas.
Está bien explicado aquí: http://stackoverflow.com/a/136411/27512 – kevingessner
Parece que 'key' es global, ¿de dónde es este código, puede publicar un enlace a él? – elclanrs
@elclanrs Estaba equivocado. Este código es de utils.js de Chrome. Js – scusyxx