TL;DR:
这两个都是有效且等效的:
var foo = L.tileLayer(arguments);
var foo = new L.TileLayer(arguments);
这两个在语法上是有效的(因为 Javascript 的历史包袱),但最终会导致错误:
var foo = new L.tileLayer(arguments);
var foo = L.TileLayer(arguments);
要添加瓦片层至少可以使用两种方法,L.TileLayer()
and L.tileLayer()
好吧,他们并不是真正的两个methods。从技术上来说L.TileLayer
是一个实例Object
, and L.tileLayer
是一个实例Function
,它继承了原型Object
. And L
充当命名空间而不是类实例。
你看,Javascript 中的面向对象编程是weird。您可以使用new keyword几乎任何有原型的对象。和基于原型的继承对于大多数精通“正确”OOP 的人来说,理解起来很混乱。
如今,随着 ES2015 标准和花哨的class
关键字这并不是真正的问题(我想说这是一个问题,但隐藏在语法糖层之下)。但在过去,开发人员不得不求助于,比方说,类继承的创造性解决方案有时涉及打乱原型链.
Leaflet 使用了这些方法的组合 - 和作为不良副作用, L.TileLayer
成为一个Function
并且可以打电话L.TileLayer()
直接,这很令人困惑。
传单还使用了以下概念:工厂功能:返回类实例的函数。引用自传单教程之一:
大多数Leaflet类都有相应的工厂功能。工厂函数与类具有相同的名称,但在lowerCamelCase
代替UpperCamelCase
:
function myBoxClass(name, options) {
return new MyBoxClass(name, options);
}
这只是为了方便:它使用户无需键入new
关键词回到了一个时代new
关键字是feared.
但这创造了另一个不良副作用,因为在 Javascript 中所有Function
有一个原型,这意味着你可以做类似的事情
function myFunction() { ... }
var wtf = new myFunction();
所以,new L.tileLayer()
也是有效的语法(但在运行时失败)。
那么有什么用L.TileLayer()
?
再次,L.TileLayer()
作为函数调用是一个不希望的副作用。但L.TileLayer
代表一个类,对其进行引用很重要,因为:
if (layer instanceof L.TileLayer)