Vamos dar o exemplo primeiro:
// Objeto de envenenamento.prototypeObject.prototype.bar = 1; var foo = {moo: 2}; para (var i em foo) {console.log (i); // imprime bar e moo}Precisamos prestar atenção a dois pontos aqui. Uma é que o for in loop ignorará o atributo definido como enumerável a falso. Por exemplo, a propriedade de comprimento de uma matriz. Segundo, uma vez que em Will percorreu toda a cadeia de protótipos, quando a cadeia de protótipos for muito longa, terá um impacto no desempenho.
Enumerable é uma palavra muito estranha. De fato, é difícil para você encontrar sua sombra em JavaScript e é realmente emprestado do autor de Ruby. O objetivo de criar um enumerável não é usá -lo de forma independente, mas usar o método "misto". Muitos métodos no protótipo usam enumeráveis, portanto, pode -se dizer que é a pedra angular do protótipo. Não vou dar uma introdução detalhada aqui, consulte os detalhes - enumerável.
Como não podemos alterar o comportamento do próprio loop, só podemos pegar outros métodos para filtrar propriedades que não querem aparecer no loop. Através de "JavaScript Learning Notes Objects (iii): HasownProperty", sabemos que o método HasownProperty pode fazer isso.
Filtre usando o HASOWNPROPERTY
Ainda usando o exemplo anterior:
// Objeto de envenenamento.prototypeObject.prototype.bar = 1; var foo = {moo: 2}; para (var i em foo) {if (foo.HasownProperty (i)) {console.log (i); }}Esta é a única maneira correta de escrevê -lo. Como usamos o método HASOWNPROPERTY, somos somente o MOO desta vez. Se o método HASOWNPROPERTY não for aplicável, um erro aparecerá quando o objeto.Prototype for estendido.
Agora, muitas estruturas optam por estender o método do object.prototype; portanto, quando usamos essas estruturas, encontraremos problemas se usarmos um loop for in loop que não for filtrado com o HasOwnsProperty.
Resumir
Recomenda -se desenvolver o bom hábito de propriedades de filtragem HASOWNPROPERTY, não faça suposições sobre o ambiente de corrida, independentemente de o objeto de protótipo nativo ser expandido.