Расширение объектов карты - PullRequest
2 голосов
/ 24 марта 2009

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

var map = {'one':1, 'two':2};

и я хотел бы иметь метод проверки существования ключа:

if (map.containsKey('one')){...}

Как бы расширить объект карты?

Ответы [ 6 ]

9 голосов
/ 25 марта 2009

Опасно изменять Object.prototype , потому что влияет на все объекты и обычно ломает другие библиотеки, которые вы, возможно, используете . В общем, если вы хотите добавить методы к объекту, подобному словарю, вы должны создать объект для ваших хеш-экземпляров, наследуемых от , например, объект-хэш Prototype .

Для этого конкретного случая вы должны просто использовать либо if (key in map), либо if (map.hasOwnProperty(key)).

4 голосов
/ 25 марта 2009

Уже есть оператор для проверки существования ключа внутри объекта.

(В JavaScript объекты реализованы в виде карт, поэтому на самом деле реальной карты нет.)

if( 'one' in map ) 
{
   alert(map['one']);
}
1 голос
/ 24 марта 2009

Это не "карты", это объекты. Опираясь на ответ Мориса, если вы хотите, чтобы это относилось ко всем объектам:

Object.prototype.containsKey = function(key) {
    return this.hasOwnProperty(key);
};
0 голосов
/ 25 марта 2009

Как уже говорили другие, расширение Object.prototype может не быть хорошей идеей, если ваш код должен хорошо играть с кодом, написанным людьми, не знающими hasOwnProperty().

В любом случае, я знаю три «правильных» способа проверить, доступно ли свойство:

obj.hasOwnProperty(name)

проверяет, существует ли свойство с данным именем в объекте.

name in obj

дополнительно включает свойства, унаследованные через цепочку прототипов объекта.

typeof obj[name] !== 'undefined'

дополнительно оценивает false, если свойство присутствует, но было установлено на undefined.

Некоторые объекты не-JS (например, window.external в IE) могут не реализовывать hasOwnProperty(), поэтому необходимо использовать одну из других проверок.

0 голосов
/ 25 марта 2009

В Javascript такой метод на самом деле не нужен.

if ( map['one'] ) {
   // do something
}

должен это сделать

0 голосов
/ 24 марта 2009

Самый простой способ сделать это - добавить функцию непосредственно в объект:

map.containsKey = function(key) {
    return this[key] ? true : false;
};
...