可以扩展Google Maps API v3中的许多类,特别是google.maps.MVCObject和google.maps.OverlayView。
在某些示例中,它们将在回调函数initMap
中扩展一个类。我的应用程序比这些示例更强大,并且不希望在回调函数中定义一堆类。
(A)的解决方案是否在我自己的脚本之前包含Google Maps API而不包含回调函数?或者(B)我只是在回调函数中定义所有内容吗?或(C)其他一些方法。
<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY"></script>
<script src="./assets/js/main.js" type="module"></script>
<script src="./assets/js/main.js" type="module"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=initMap"></script>
initMap
位于main.js
的位置,如下所示:
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.
}
其他一些方法。
答案 0 :(得分:2)
该文档描述了以下扩展映射类的方法:
MVCObject构造函数保证是一个空函数,所以你可以通过编写MySubclass.prototype = new google.maps.MVCObject();来继承自MVCObject;
和
通过设置叠加层的原型来继承此类:MyOverlay.prototype = new google.maps.OverlayView();. OverlayView构造函数保证是一个空函数。
所以(一个可能的)选项 C 将分别定义您的类,然后只在initMap中配置继承:
function initMap() {
Alpha.prototype = new google.maps.MVCObject();
Bravo.prototype = new google.maps.MVCObject();
...
}
或者,更好的是,要将所有内容保持在一起,您可以在库文件中使用一些引导函数,因此在initMap
中您只需执行此操作:
// 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
方法),或者我们可以在没有方法的情况下定义构造函数,立即创建实例并在其上定义方法:
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();
}
要创建更多Alpha
个实例,我们可以克隆现有的alpha
对象。
另一种选择是使用原型定义自己的对象,然后使用Alpha.prototype.prototype = MVCObject
construct:
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();
}
答案 1 :(得分:1)
您可以在代码中使用版本A及更高版本,您可以在main.js文件中附加initMap回调。这样你就必须使用ajax调用来应用你的回调函数。
否则你必须从头开始使用选项B,并在main.js文件中定义initMap函数。
您还应该以异步模式加载google maps api:
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY" async defer></script>
文档和示例:https://developers.google.com/maps/documentation/javascript/examples/map-simple
答案 2 :(得分:0)
在单独的 my_lib.js 文件()中,该文件应在'... maps.googleapis.com / .. etc