Tomemos el ejemplo primero:
// envenenamiento objeto.prototypeObject.prototype.bar = 1; var foo = {moo: 2}; for (var i en foo) {console.log (i); // Imprime la barra y el moo}Tenemos que prestar atención a dos puntos aquí. Una es que el bucle para en el bucle ignorará el atributo establecido en enumerable a falso. Por ejemplo, la propiedad de una matriz. En segundo lugar, dado que en IN avanzará toda la cadena prototipo, cuando la cadena prototipo sea demasiado larga, tendrá un impacto en el rendimiento.
Enumerable es una palabra muy extraña. De hecho, es difícil para usted encontrar su sombra en JavaScript, y en realidad se le toma prestado del autor de Ruby. El propósito de crear un enumerable no es usarlo de forma independiente, sino usar el método "mixto". Muchos métodos en el prototipo usan enumerables, por lo que se puede decir que es la piedra angular del prototipo. No daré una introducción detallada aquí, consulte los detalles, enumerables.
Dado que no podemos cambiar el comportamiento del bucle en el bucle en sí, solo podemos tomar otros métodos para filtrar propiedades que no quieren aparecer en el bucle. A través de "JavaScript Learning Notes Objects (iii): Hasownproperty", sabemos que el método de HaswnProperty puede hacer esto.
Filtro usando aSownProperty
Todavía usando el ejemplo anterior:
// envenenamiento objeto.prototypeObject.prototype.bar = 1; var foo = {moo: 2}; for (var i en foo) {if (foo.hasownproperty (i)) {console.log (i); }}Esta es la única forma correcta de escribirlo. Dado que hemos utilizado el método de HasownProperty, solo emitimos MOO esta vez. Si el método de HaswnProperty no es aplicable, aparecerá un error cuando se extienda Object.Prototype.
Ahora, muchos marcos eligen extender el método desde Object.Prototype, por lo que cuando usamos estos marcos, encontraremos problemas si usamos un bucle para en el bucle que no se filtra con HasnownProperty.
Resumir
Se recomienda desarrollar el buen hábito de las propiedades de filtrado de Property de Haswn, no haga suposiciones sobre el entorno en ejecución, independientemente de si el objeto prototipo nativo se expande.