2013-04-04 5 views
4

Я подписался на общей идиомы:Безопасность. Может ли созданные объекты иметь неизвестные свойства?

for(var key in obj){ 
    if(obj.hasOwnPropery(key)){ 
     // do stuff 
    } 
} 

, но если я что-то вроде: мне нужно беспокоиться о obj, имеющих другие свойства, чем «а» и «б»

var obj = {a: 'a', b: 'b'}; 

ли когда я петлю?

Или вышеупомянутая идиома в первую очередь относится к объектам, которые разработчик не создал?

ответ

8

Технически да, 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

+0

Если я работаю в своем собственном IIFE, как и в большинстве библиотек, можно ли другой библиотеке изменить Object.prototype, который я использую? – 2013-04-04 17:09:58

+1

Если он имеет hasownproperty(), он все равно влияет на него? – theshadowmonkey

+0

@theshadowmonkey Нет, но я думаю, что OP задавался вопросом, нужно ли 'hasOwnProperty'. Это хороший момент, но я просто добавлю, что в – Ian

Смежные вопросы