Технически да, Object.prototype
может быть изменен (по хорошей или плохой причине). Они отображаются как перечислимые свойства (которые будут отображаться при перечислении).
Когда изменен Object.prototype
, он затрагивает все экземпляры объектов, поэтому ваш obj
включен в это. Например, если какой-либо другой скрипт/библиотека выполняет это:
Object.prototype.keyLength = function() {
var count = 0;
for (var key in this) {
if (this.hasOwnProperty(key)) count++;
}
return count;
};
Тогда это будет результаты итерация вашего obj
(без использования hasOwnProperty
):
a
b
keyLength
(не обязательно в таком порядке)
Если вы использовали hasOwnProperty
, вы увидите только «a» и «b».
Невозможно изменить прототип Object
(по нескольким причинам), но «безопасный» способ сделать это с Object.defineProperty
- https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty. Вы можете описать ее как перечислимую или нет. Это более новый метод, поэтому он не доступен глобально в браузерах. Конечно, вы не можете заставить другие библиотеки использовать это, поскольку у вас нет контроля над ними. Но если вы можете, это целесообразно для вашего собственного использования.
Ваше использование hasOwnProperty
заключается в том, чтобы убедиться, что ключ, на который вы смотрите, является фактическим свойством, а не свойством в цепочке прототипов и не может быть перечислим. Что решает проблему «prototype
». Только для справки - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
Если я работаю в своем собственном IIFE, как и в большинстве библиотек, можно ли другой библиотеке изменить Object.prototype, который я использую? – 2013-04-04 17:09:58
Если он имеет hasownproperty(), он все равно влияет на него? – theshadowmonkey
@theshadowmonkey Нет, но я думаю, что OP задавался вопросом, нужно ли 'hasOwnProperty'. Это хороший момент, но я просто добавлю, что в – Ian