Вопрос

Я не знаю, как расширить объект карты с помощью прототипа, и надеюсь, что вы сможете помочь.У меня есть что-то вроде этого:

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(), поэтому необходимо использовать одну из других проверок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top