[英]when to use L.TileLayer vs L.tileLayer
我刚刚使用 Leaflet 为网站构建地图,并注意到添加 Tile Layer 至少可以使用两种方法, L.TileLayer()
和L.tileLayer()
,它们的名称仅在以下情况下有所不同单个字符。
然而,虽然由这两种方法所返回的对象可以被添加到由返回的地图对象L.map()
返回的对象L.TileLayer()
似乎不具有addTo()
而通过返回的对象方法L.tileLayer()
。 例如两者
var map = L.map('map');
var tiles = new L.TileLayer(<tileUrl>, {attribution: <tileAttrib>});
map.addLayer(tiles);
和
var map = L.map('map');
var tiles = new L.tileLayer(<tileUrl>, {attribution: <tileAttrib>});
map.addLayer(tiles);
也
var map = L.map('map');
L.tileLayer(<tileUrl>, {attribution: <tileAttrib>}).addTo(map);
同时
var map = L.map('map');
L.TileLayer(<tileUrl>, {attribution: <tileAttrib>}).addTo(map);
失败。 浏览单张的文件,似乎使用正确的方法是L.tileLayer()
这样的问题,那么是什么用的L.TileLayer()
到目前为止,这是我的代码的完整示例,要尝试不同的替代方案,只需取消对要测试的替代方案的注释,并确保对其他替代方案进行了注释
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.3/dist/leaflet.css"
integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ=="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.3.3/dist/leaflet.js"
integrity="sha512-tAGcCfR4Sc5ZP5ZoVz0quoZDYX5aCtEm/eu1KhSLj2c9eFrylXZknQYmxUssFaVJKvvc0dJQixhGjG2yXWiV9Q=="
crossorigin=""> </script>
</head>
<body onload="makeMap()">
<script type="text/javascript">
function makeMap() {
var tileUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var tileAttrib = 'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
var map = L.map('map').setView([63,15],9);
// using tileLayer and addLayer - this works
var tiles = new L.tileLayer(tileUrl, {attribution: tileAttrib});
map.addLayer(tiles);
// using tileLayer and addTo - this works
// L.tileLayer(tileUrl, {attribution: tileAttrib}).addTo(map);
// using TileLayer and addLayer - this works
// var tiles = new L.TileLayer(tileUrl, {attribution: tileAttrib});
// map.addLayer(tiles);
// using TileLayer and addTo - this fails
// L.TileLayer(tileUrl, {attribution: tileAttrib}).addTo(map);
}
</script>
<table border=1 style="position: absolute; top: 0; bottom: 0; left: 0; right: 0; width: 100%; height: 100%;">
<tr style="height: 100%;">
<td>
<div id="map" style="width: 100%; height: 100%;"></div>
</td>
</tr>
</table>
</body>
</html>
特尔;博士:
这两个既有效又等效:
var foo = L.tileLayer(arguments);
var foo = new L.TileLayer(arguments);
这两个在语法上是有效的(因为 Javascript 的历史包袱),但最终会导致错误:
var foo = new L.tileLayer(arguments);
var foo = L.TileLayer(arguments);
添加tilelayer至少可以使用两种方法,
L.TileLayer()
和L.tileLayer()
好吧,它们并不是真正的两种方法。 从技术上讲, L.TileLayer
是Object
一个实例,而L.tileLayer
是Function
一个实例,它继承了Object
的原型。 L
充当命名空间而不是类实例。
你看,Javascript 中的面向对象编程很奇怪。 您可以将new
关键字用于几乎任何具有原型的对象。 对于大多数精通“正确”OOP 的人来说, 基于原型的继承是难以掌握的。
如今,有了 ES2015 标准和花哨的class
关键字,这并不是一个真正的问题(我会说这是一个问题,但隐藏在语法糖层之下)。 但在过去,开发人员不得不求助于,比如说,类继承的创造性解决方案,有时涉及弄乱原型链。
Leaflet 使用了这些方法的组合 -作为一种不受欢迎的副作用, L.TileLayer
变成了一个Function
并且可以直接调用L.TileLayer()
,这很令人困惑。
Leaflet 还使用了工厂函数的概念:返回类实例的函数。 引自传单教程之一:
大多数 Leaflet 类都有相应的工厂函数。 工厂函数与类具有相同的名称,但使用
lowerCamelCase
而不是UpperCamelCase
:function myBoxClass(name, options) { return new MyBoxClass(name, options); }
这意味着仅仅作为一种方便:它节省打字的用户new
在的时代关键词回new
关键字是担心。
但这会产生另一个不受欢迎的副作用,因为在 Javascript 中所有Function
都有一个原型,这意味着你可以做类似的事情
function myFunction() { ... }
var wtf = new myFunction();
因此, new L.tileLayer()
也是有效的语法(但在运行时失败)。
那么
L.TileLayer()
什么用呢?
再一次,作为函数调用的L.TileLayer()
是一个不受欢迎的副作用。 但是L.TileLayer
代表一个类,引用它很重要,因为如下:
if (layer instanceof L.TileLayer)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.