A instrução for in é usada para listar as propriedades (membros) de um objeto, como segue
Copie o código do código da seguinte forma:
var obj = { nome:"jack",
getNome:função(){retornar este.nome}
};
//Nome da saída,getName
for(var atr em obj) {
alerta(atr);
}
Você notou que não há propriedades integradas (ou membros integrados, propriedades ocultas e propriedades predefinidas), como toString e valueOf de obj. Ou seja, for in é usado para enumerar os membros exibidos (membros personalizados) do objeto.
Se você substituir as propriedades integradas, reescreva o toString do obj abaixo.
Copie o código do código da seguinte forma:
var obj = {nome:"jack",
getNome:função(){retornar este.nome},
toString:function(){return "Eu sou o Jack."}
}
for(var atr em obj) {
alerta(atr);
}
Qual será a saída?
1. No IE6/7/8, é o mesmo que sem reescrever toString e ainda gera apenas name e getName.
2. Em IE9/Firefox/Chrome/Opera/Safari, name, getName, toString são gerados.
Se você adicionar propriedades/métodos ao protótipo integrado, ele também poderá ser percorrido durante for in
Copie o código do código da seguinte forma:
Object.prototype.clone = função() {}
varobj = {
nome: 'Jack',
idade: 33
}
//nome, idade, clone
para (var n em obj) {
alerta(n)
}
O método clone é adicionado a Object.prototype e todos os navegadores exibem clone quando for in.
Isso pode não importar, porque geralmente não é recomendado estender o protótipo do construtor integrado, o que é uma das razões para o declínio do Prototype.js. jQuery e Underscore não estendem o autoprotótipo. O primeiro faz barulho sobre o objeto jQuery, enquanto o último simplesmente trava todos os métodos sob o sublinhado.
Mas às vezes, para ser compatível com ES5 ou versões posteriores, estenderemos o protótipo do construtor integrado em navegadores que não suportam ES5 (IE6/7/8). Nesse caso, for in será diferente em cada um. navegador. do seguinte modo
Copie o código do código da seguinte forma:
if (!Function.prototype.bind) {
Function.prototype.bind = function(escopo) {
var fn = isso
função de retorno () {
fn.apply(escopo, argumentos)
}
}
}
função cumprimentar(nome) {
alerta(this.greet + ', ' + nome)
}
for (var n em saudação) {
alerta(n)
}
As saídas do IE6/7/8 são vinculadas, mas outros navegadores não. Como o bind tem suporte nativo em navegadores modernos e for in não está disponível, o IE6/7/8 adiciona bind ao Function.prototype.
Para resumir: no design entre navegadores, não podemos confiar em for in para obter os nomes dos membros do objeto. Geralmente usamos hasOwnProperty para julgar.