JavaScript: Фильтрация нестандартных свойств и методов во встроенных объектах. Метод «hasOwnProperty»

2011-12-24

Некоторые 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 для фильтрации унаследованных свойств.



Добавить комментарий