关于javascript:扩展Google Maps API v3类的最佳方式

Best way to extend Google Maps API v3 Classes

可以扩展google maps api v3中的一些类,特别是google.maps.mvcobject和google.maps.overlayview。

在一些示例中,它们将在回调函数initMap中扩展类。我的应用程序比那些例子更健壮,不希望在回调函数中定义一系列类。

(a)的解决方案是在我自己的脚本之前包含google maps api,而不包含回调函数吗?或者(b)我只是定义回调函数中的所有内容吗?或(c)其他方法。

选项A

1
2
<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY">
<script src="./assets/js/main.js" type="module">

选项B

1
2
<script src="./assets/js/main.js" type="module">
<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=initMap">

其中initMapmain.js中,看起来是这样的:

1
2
3
4
5
6
7
8
9
10
11
function initMap() {

  class Alpha extends google.maps.MVCObject {}
  class Bravo extends google.maps.MVCObject {}
  class Charlie extends google.maps.MVCObject {}
  // More classes.
  class Zulu extends google.maps.MVCObject {}

  // Rest of code.

}

选项C

其他方法。


《文献describes下面的方式:他们在地图上

The MVCObject constructor is guaranteed to be an empty function, and so you may inherit from MVCObject by simply writing MySubclass.prototype = new google.maps.MVCObject();

Inherit from this class by setting your overlay's prototype: MyOverlay.prototype = new google.maps.OverlayView();. The OverlayView constructor is guaranteed to be an empty function.

所以这一可能的选项C)将是你的类的定义,然后分别在"只读configure传承的initmap:

1
2
3
4
5
6
function initMap() {

  Alpha.prototype = new google.maps.MVCObject();
  Bravo.prototype = new google.maps.MVCObject();
  ...
}

或者,更好的保持平衡,一切都在一起,你可以拥有一些自助图书馆的功能在你的文件,所以你会在initMap正是这样做的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// in my_library.js:
// For now we don't mention that our class extends MVCObject
function Alpha() {
    console.log('Constructed Alpha');
    this.my_method = function() {
       // the `parent_method` can be defined in the
       // prototype we assign later
       this.parent_method();
    }
}

function Bravo() {
    console.log('Constructed Alpha');
}    

// The function to dynamically subclass our classes.
function init() {
   Alpha.prototype = new google.maps.MVCObject();
   Bravo.prototype = new google.maps.MVCObject();
}

// The callback for google maps script.
function initMap() {
    // invoke the `init` from my_library.
    my_library.init();;
}

以上实例的辨别方法(我们定义Alpha方法在《constructor alternatively),我们可以定义的方法constructor没有立即报审,创建和定义在它的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
function Alpha() {
    console.log('Constructed Alpha');
}

var alpha = new Alpha();
alpha.my_method = function() {
   this.parent_method();
}

// The function to dynamically subclass our classes.
function init() {
   alpha.prototype = new google.maps.MVCObject();
}

创造更多的Alphainstances clone,我们可以在现有Alpha对象。

一个替代的冰的两个定义自己的对象使用的原型,然后使用Alpha.prototype.prototype = MVCObject构造:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Alpha() {
    console.log('Constructed Alpha');
}

Alpha.prototype.my_method = function() {
   this.parent_method();
}

// The function to dynamically subclass our classes.
function init() {
   // We can not overwrite Alpha.prototype as we will loose
   // the methods we defined, so we assign the prototype of
   // the prototype
   Alpha.prototype.prototype = new google.maps.MVCObject();
}


你可以使用A和以后的版本,你可以在你的代码append《initmap main.js回调你的文件。在这种方式我可以使用Ajax要求申请yout回调功能。

否则你会有两个选项B"的使用和定义开始,《initmap main.js功能在你的文件。

你应该也负载的Google Maps API在异步模式:

1
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY" async defer>

文献和实例:http:/ / / / developers.google.com地图JavaScript文件/ / /图的简单例子