Javascript 何时使用L.TileLayer vs L.TileLayer
我刚刚使用传单为一个网站创建了一张地图,并注意到要添加一个平铺层,至少可以使用两种方法,Javascript 何时使用L.TileLayer vs L.TileLayer,javascript,leaflet,Javascript,Leaflet,我刚刚使用传单为一个网站创建了一张地图,并注意到要添加一个平铺层,至少可以使用两种方法,L.TileLayer()和L.TileLayer(),它们的名称只因单个字符的大小写而有所不同 但是,虽然这两种方法返回的对象都可以添加到L.map()返回的映射对象中,L.TileLayer()返回的对象似乎没有addTo()方法,而L.TileLayer()返回的对象。例如,两者都有 var map = L.map('map'); var tiles = new L.TileLayer(<tile
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);
TL;医生: 这两种方法都是有效且等效的:
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
是对象的一个实例,L.TileLayer
是函数的一个实例,它继承了对象的原型。而L
充当名称空间而不是类实例
你看,Javascript中的面向对象编程很奇怪。您可以对几乎任何具有原型的对象使用。对于大多数精通“正确的”OOP的人来说,理解起来很混乱
如今,有了ES2015标准和花哨的类
关键字,这并不是一个真正的问题(我认为这是一个问题,但隐藏在语法糖层之下)。但回到过去,开发者不得不求助于,比如说,有时会涉及到
传单使用了这些方法的组合——作为一种不希望出现的副作用,L.TileLayer
变成了一个函数
,人们可以直接调用L.TileLayer()
,这非常令人困惑
传单还使用了:返回类实例的函数的概念。引述自:
大多数传单类都有相应的。factory函数与类具有相同的名称,但使用的是lowerCamelCase
而不是UpperCamelCase
:
function myBoxClass(name, options) {
return new MyBoxClass(name, options);
}
这只是为了方便起见:它让用户不用再键入new
关键字,回到了new
关键字令人恐惧的时代
但这会产生另一个不希望出现的副作用,因为在Javascript中,所有的函数都有一个原型,这意味着您可以像
function myFunction() { ... }
var wtf = new myFunction();
因此,newl.tillelayer()
也是有效语法(但在运行时失败)
那么L.TileLayer()的用途是什么
同样地,L.TileLayer()
作为函数调用是一个不希望出现的副作用。但是L.TileLayer
表示一个类,因此有一个对该类的引用非常重要,因为:
if (layer instanceof L.TileLayer)
vs
var foo = new L.tileLayer(arguments);
var foo = L.TileLayer(arguments);
function myBoxClass(name, options) {
return new MyBoxClass(name, options);
}
function myFunction() { ... }
var wtf = new myFunction();
if (layer instanceof L.TileLayer)