Оператор for in используется для перечисления свойств (членов) объекта следующим образом:
Скопируйте код кода следующим образом:
var obj = { name:"Джек",
getName:function(){вернуть это.имя}
};
//Выходное имя,getName
for(var atr в obj) {
оповещение (атр);
}
Заметили ли вы, что в объекте obj нет встроенных свойств (или встроенных членов, скрытых свойств и предопределенных свойств), таких как toString и valueOf. То есть for in используется для перечисления отображаемых членов (пользовательских членов) объекта.
Если вы переопределите встроенные свойства, перепишите объект toString ниже.
Скопируйте код кода следующим образом:
var obj = {name:"Джек",
getName:function(){return this.name},
toString:function(){return "Я Джек."}
}
for(var atr в obj) {
оповещение (атр);
}
Что будет выведено?
1. В IE6/7/8 это то же самое, что и без перезаписи toString, и по-прежнему выводит только имя и getName.
2. В IE9/Firefox/Chrome/Opera/Safari выводятся name, getName, toString.
Если вы добавите свойства/методы во встроенный прототип, его также можно будет перемещать во время выполнения.
Скопируйте код кода следующим образом:
Object.prototype.clone = функция() {}
вар объект = {
имя: 'Джек',
возраст: 33
}
// имя, возраст, клон
for (var n в obj) {
предупреждение (н)
}
Метод clone добавляется в Object.prototype, и все браузеры отображают клон при входе.
Это может не иметь значения, поскольку обычно не рекомендуется расширять прототип встроенного конструктора, что является одной из причин упадка Prototype.js. jQuery и Underscore не расширяют собственный прототип. Первый суетится вокруг объекта jQuery, а второй просто подвешивает все методы под подчеркиванием.
Но иногда, чтобы быть совместимым с ES5 или последующими версиями, мы расширяем прототип встроенного конструктора на браузеры, не поддерживающие ES5 (IE6/7/8). В этом случае in будет другим. каждый браузер. следующее
Скопируйте код кода следующим образом:
если (!Function.prototype.bind) {
Function.prototype.bind = функция(область действия) {
вар fn = это
функция возврата () {
fn.apply(область действия, аргументы)
}
}
}
функция приветствие(имя) {
alert(this.greet + ', ' + имя)
}
for (var n в приветствии) {
предупреждение (н)
}
Выходные данные IE6/7/8 привязываются, но другие браузеры этого не делают. Поскольку привязка изначально поддерживается в современных браузерах, а in недоступна, IE6/7/8 добавляет привязку к Function.prototype.
Подведем итог: при кроссбраузерном проектировании мы не можем полагаться на in для получения имен членов объекта. Обычно для оценки мы используем hasOwnProperty.