Estendendo objetos de mapa
-
21-08-2019 - |
Pergunta
Eu não sei como estender o objeto do mapa com o protótipo e espero que possa ajudar. Eu tenho algo parecido com isto:
var map = {'one':1, 'two':2};
e eu gostaria de ter um método para verificar a existência de uma chave:
if (map.containsKey('one')){...}
Como eu poderia estender o objeto do mapa?
Solução
É perigoso modificar Object.prototype , porque isso afeta todos os objetos e normalmente irá quebrar outras bibliotecas que você pode estar usando . Em geral, se você quiser adicionar métodos para um dicionário-como objeto, você deve criar um objeto para suas instâncias de hash para herdar, como o objeto de protótipo Hash .
Para este caso específico, você realmente deve apenas usar if (key in map)
ou if (map.hasOwnProperty(key))
.
Outras dicas
Já existe um operador para testar a existência de uma chave dentro de um objeto.
(Em JavaScript, objetos são implementados como mapas então na verdade não existe mapa real.)
if( 'one' in map )
{
alert(map['one']);
}
Estes não são "mapas" são objetos. Com base na resposta de Maurice, se você quer que isso se aplica a todos os objetos:
Object.prototype.containsKey = function(key) {
return this.hasOwnProperty(key);
};
A maneira mais simples de fazer isso é adicionar uma função diretamente no objeto:
map.containsKey = function(key) {
return this[key] ? true : false;
};
Em Javascript, você não precisa de tal método realmente.
if ( map['one'] ) {
// do something
}
deve fazê-lo
Como outros já disse, estendendo Object.prototype
pode não ser uma boa idéia se o seu código tem que jogar bonito com código escrito por pessoas ignorantes de hasOwnProperty()
.
De qualquer forma, existem três formas 'corretas' que eu conheço para verificar se a propriedade está disponível:
obj.hasOwnProperty(name)
verifica se uma propriedade com determinado nome existe no objeto.
name in obj
adicionalmente inclui propriedades herdadas através cadeia protótipo de um objecto.
typeof obj[name] !== 'undefined'
, adicionalmente, avaliar a false
se a propriedade está presente, mas foi definido para undefined
.
Alguns de JS não-objecto (por exemplo window.external
no IE) pode não implementar hasOwnProperty()
, então um dos outros controlos tem de ser usado.