La declaración for in se utiliza para enumerar las propiedades (miembros) de un objeto, de la siguiente manera
Copie el código de código de la siguiente manera:
var obj = {nombre:"jack",
getName:función(){devolver este.nombre}
};
//Nombre de salida,getName
para (var atr en obj) {
alerta(atr);
}
¿Notaste que no hay propiedades integradas (o miembros integrados, propiedades ocultas y propiedades predefinidas) como toString y valueOf de obj. Es decir, for in se utiliza para enumerar los miembros mostrados (miembros personalizados) del objeto.
Si anula las propiedades integradas, vuelva a escribir obj's toString a continuación.
Copie el código de código de la siguiente manera:
var obj = {nombre:"jack",
getName:función(){devolver este.nombre},
toString:function(){return "Soy jack."}
}
para (var atr en obj) {
alerta(atr);
}
¿Cuál será el resultado?
1. En IE6/7/8, es lo mismo que sin reescribir toString, y aún así solo genera nombre y getName.
2. En IE9/Firefox/Chrome/Opera/Safari, se genera name, getName, toString.
Si agrega propiedades/métodos al prototipo incorporado, también será transitable durante for in
Copie el código de código de la siguiente manera:
Objeto.prototipo.clon = función() {}
var objeto = {
nombre: 'gato',
edad: 33
}
// nombre, edad, clon
para (var n en obj) {
alerta(n)
}
El método clonar se agrega a Object.prototype y todos los navegadores muestran clonar cuando está en.
Puede que esto no importe, porque generalmente no se recomienda extender el prototipo del constructor incorporado, que es una de las razones del declive de Prototype.js. jQuery y Underscore no amplían el autoprototipo. El primero se preocupa por el objeto jQuery, mientras que el segundo simplemente cuelga todos los métodos bajo guión bajo.
Pero a veces para que sea compatible con ES5 o versiones posteriores, extenderemos el prototipo del constructor integrado en navegadores que no soportan ES5 (IE6/7/8). navegador. como sigue
Copie el código de código de la siguiente manera:
si (! Función.prototipo.bind) {
Función.prototipo.bind = función(alcance) {
var fn = esto
función de retorno () {
fn.apply(alcance, argumentos)
}
}
}
función saludar (nombre) {
alerta(este.saludo + ', ' + nombre)
}
para (var n en saludar) {
alerta(n)
}
Las salidas de IE6/7/8 se vinculan, pero otros navegadores no. Debido a que bind es compatible de forma nativa con los navegadores modernos y for in no está disponible, IE6/7/8 agrega bind a Function.prototype.
Para resumir: en el diseño de varios navegadores, no podemos confiar en for para obtener los nombres de los miembros del objeto. Generalmente usamos hasOwnProperty para juzgar.