Maneira correta de determinar o tipo de camada Leaflet?

8

Qual é a abordagem correta (ou recomendada) para identificar um "tipo" de camada no Leaflet / Javascript?

Eu posso usar com êxito layer instanceof, mas isso só funciona quando você conhece o tipo em tempo de design (o que eu espero que seja geralmente o caso).

map.eachLayer(function(layer) {
    console.log('_leaflet_id=' + layer._leaflet_id + ' is layer type= '+ getLayerTypeName(layer));

function getLayerTypeName(layer)
{
    if (layer instanceof L.Marker){
        return 'Marker';
    }
    else if (layer instanceof L.Tooltip){
        return 'Tooltip';
    }
    else if (layer instanceof L.esri.DynamicMapLayer){
        return 'DynamicMapLayer';
    }
    else if (layer instanceof L.esri.BasemapLayer){
        return 'BasemapLayer';
    }   
    else if (layer instanceof L.Layer){
        return 'Layer';
    }        
    else
    {
        return 'Unknown';
    }
}

Existe uma abordagem diferente que eu deveria estar usando?

https://jsfiddle.net/CumminsJP/tb28qwpo/

Jay Cummins
fonte

Respostas:

2

Este não é realmente um problema do Leaflet, mas um problema geral com Javascript. E preocupa-se especificamente quando você deseja o nome do objeto. Para comparações, existem várias maneiras de fazer isso com segurança (como no seu exemplo).

Javascript não tem classes, então você só pode confiar

layer.constructor.name

No entanto, se você usar código minificado, os nomes dos construtores geralmente mudam (como também são minificados), para que não fiquem legíveis.

Algumas bibliotecas adicionam os nomes dos objetos como propriedades (o Leaflet não), mas você raramente precisa deles como texto.

Consulte https://stackoverflow.com/a/1249554 para uma discussão mais detalhada.

Observe que você nunca deve usar esses nomes para nada em seu código (comparação / identificação), exceto a saída direta (depuração), pois eles não são confiáveis.

Senshi
fonte