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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top