我通过调用var map = L.map('leaflet', options);
创建了一个Leaflet映射,但这只是使一个对象充满了以下划线为前缀的私有值:
Object.keys(map) === ["options", "_container", "_leaflet_id", "_containerId", `"_fadeAnimated", "_panes", "_paneRenderers", "_mapPane", "_controlCorners", "_controlContainer", "_onResize", "_targets", "_events", "_zoom", "_loaded", "_lastCenter", "_size", "_sizeChanged", "_pixelOrigin", "_firingCount", "_handlers", "_layers", "_zoomBoundLayers", "_initHooksCalled", "dragging", "doubleClickZoom", "scrollWheelZoom", "touchZoom", "boxZoom", "keyboard", "_zoomAnimated", "_proxy", "_layersMaxZoom", "_layersMinZoom"]`
地图仍显示。没有控制台错误。但我无法调用map.getCenter()
或map.getContainer()
之类的内容,因为map
上不存在这些方法。为什么这些方法不在map
?
答案 0 :(得分:3)
请记住,Object.keys
仅返回对象的可枚举拥有属性。
根据定义,方法应该从类继承,而不是拥有属性。
在JavaScript(ES5)中,没有正式的"类",因此它转换为"方法继承自原型"。但仍然不是拥有属性。
Leaflet做得很好,因为它尊重这种做法。
例如,不是分析Object.keys(map)
,而是直接查看map
(在像Firefox这样的现代浏览器中,执行console.log(map)
将使您能够扩展对象)并搜索{ {1}}(可能是最后一项):这是原型的链接,正确列出了__proto__
和getCenter
等方法。