Расширение объектов карты
-
21-08-2019 - |
Вопрос
Я не знаю, как расширить объект карты с помощью прототипа, и надеюсь, что вы сможете помочь.У меня есть что-то вроде этого:
var map = {'one':1, 'two':2};
и я хотел бы иметь метод проверки существования ключа:
if (map.containsKey('one')){...}
Как мне расширить объект карты?
Решение
Опасно изменять Object.prototype, потому что это влияет на все объекты и обычно нарушает работу других библиотек, которые вы можете использовать..В общем, если вы хотите добавить методы к объекту, похожему на словарь, вам следует создать объект, от которого будут наследовать ваши экземпляры хэша: как объект Prototype Hash.
В этом конкретном случае вам следует просто использовать либо if (key in map)
или if (map.hasOwnProperty(key))
.
Другие советы
Уже существует оператор для проверки существования ключа внутри объекта.
(В JavaScript объекты реализованы в виде карт, поэтому настоящей карты на самом деле не существует.)
if( 'one' in map )
{
alert(map['one']);
}
Это не «карты», это объекты.Основываясь на ответе Мориса, если вы хотите, чтобы это применялось ко всем объектам:
Object.prototype.containsKey = function(key) {
return this.hasOwnProperty(key);
};
Самый простой способ сделать это — добавить функцию непосредственно в объект:
map.containsKey = function(key) {
return this[key] ? true : false;
};
В Javascript вам действительно не нужен такой метод.
if ( map['one'] ) {
// do something
}
должен это сделать
Как уже говорили другие, расширение Object.prototype
может быть не очень хорошей идеей, если ваш код должен хорошо работать с кодом, написанным людьми, не знающими hasOwnProperty()
.
В любом случае, я знаю три «правильных» способа проверить, доступно ли свойство:
obj.hasOwnProperty(name)
проверяет, существует ли в объекте свойство с заданным именем.
name in obj
дополнительно включает свойства, унаследованные через цепочку прототипов объекта.
typeof obj[name] !== 'undefined'
дополнительно оценим false
если свойство присутствует, но для него установлено значение undefined
.
Некоторые объекты, отличные от JS (например. window.external
в IE) может не реализоваться hasOwnProperty()
, поэтому необходимо использовать одну из других проверок.