Некоторые JavaScript-библиотеки занимаются расширением стандартных возможностей встроенных объектов (что есть не очень хорошо). Допустим, добавляют в объект Array() или Object() методы, которых нет в стандартном наборе языка.
И, вероятно, это кому-то очень удобно, но может привести к непредвиденным последствиям в независимом коде, который выполняется в этой же среде и не предполагает о наличии таких замечательных возможностях.
Пример: независимый код использует цикл for-in для обхода объекта. Если стандартные объекты были расширены, то могут возникнуть серьезные ошибки в теле цикла.
Примет кода:
// не советую расширять прототип стандартных объектов
Object.prototype.myMethod = function() {
alert("it's my method");
}
// объявляем наш объект.
var obj = {a:1, b:2, c:3};
// Выведем все свойства этого объекта
for (var i in obj) {
alert(i);
}
// увидим: a, b, c, myMethod
Мы увидим сообщение с «myMethod», хотя его могла объявить совсем другая сторонняя независимая от нас библиотека или чужой код.
Как же защитить свой код от такой ситуации?
На этот вопрос есть простой ответ — метод hasOwnProperty. Он проверяет собственное ли это свойство объекта или унаследованное.
Пример использования:
// не советую расширять прототип стандартных объектов
Object.prototype.myMethod = function() {
alert("it's my method");
}
// объявляем наш объект.
var obj = {a:1, b:2, c:3};
// Выведем все свойства этого объекта
for (var i in obj) {
// проверяем, собственное или унаследование это свойство
if (obj.hasOwnProperty(i)) {
alert(i);
}
}
// увидим: a, b, c
Теперь сообщение с «myMethod» не вывелось.
Мораль: В циклах for-in старайтесь всегда использовать метод hasOwnProperty для фильтрации унаследованных свойств.