页面上有一个地图,一个button。javascript中有一个函数,形如:
    function initialize() {
      if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map_canvas"));
        map.setCenter(new GLatLng(37.4419, -122.1419), 13);  
      }
    }
没问题,可以显示地图。
我想做的是,按button,添加一个Marker。写了一个函数,形如:
    function displaymessage()
      {
        var map = new GMap2(document.getElementById("map_canvas"));
        map.setCenter(new GLatLng(37.4419, -122.1419), 13); 
        map.addOverlay(new GMarker(new GLatLng(37.4419, -122.1419)));
      }
也可以正常使用
但是,总觉得
        var map = new GMap2(document.getElementById("map_canvas"));
        map.setCenter(new GLatLng(37.4419, -122.1419), 13); 
这两行反复操作,效率太低,请问能否把Gmap2类只一次实例化,就能是map在整个页面里都能使用。
谢谢!!!

解决方案 »

  1.   


    像这种 对象共享式的方法 你可以使用享元模式. 我这里给你个伪代码思路.
    具体的你自己去完善吧.
    <script>
    function Gmap2(obj) {
    this.obj = obj;
    }

    var MapFactory = function() {
    var mapInstance = null;
    return {
    createMap: function(obj) {
    if(mapInstance != null) {
    mapInstance = new GMap2(obj);
    }
    return mapInstance;
    }
    }
    }(); var MapManager = function(){
    return {
    mapObj: function(obj) {
    var map = MapFactory.createMap(obj);
    return this;
    },
    setCenter: function(obj) {
    alert(obj);
    },
    addOverLay: function(obj) {

    }
    }
    }(); MapManager.mapObj(document.getElementById('map_canvas')).setCenter('test'); </script>
      

  2.   

    加点注释 /*!
    单例工厂 + 享元模式
    */
    function Gmap2(obj) {
    this.obj = obj;
    }

    /* 单例工厂 仅实例化一次 */
    var MapFactory = function() {
    var mapInstance = null;
    return {
    createMap: function(obj) {
    if(mapInstance != null) {
    mapInstance = new GMap2(obj);
    }
    return mapInstance;
    }
    }
    }();        /* 通过享元模式 将内外状态(方法)分离管理 */
    var MapManager = function(){
    return {
    mapObj: function(obj) {
    var map = MapFactory.createMap(obj);
    return this;
    },
    // 以前的公有方法 给抽象出来 单独管理. 这样内部的Gmap2都是同样的状态可以
    // 公用.从而只实例化一次.而外部状态的方法 单独管理.可以单独去添加
    setCenter: function(obj) {
    alert(obj);
    return this;
    },
    addOverLay: function(obj) {
    alert(obj);
    return this;
    }
    }
    }();
            // 返回this当前实例 以支持链式操作
    MapManager.mapObj(document.getElementById('map_canvas')).setCenter('setCenter').addOverLay('addOverLay');
      

  3.   

    var o={
        maps:{}
        ,get:function(mapid){
            var m=maps[mapid];
            if(null==m){m=new GMap2(document.getElementById(mapid)); }
            return m;
        }
    }
      

  4.   

    要想只实例化一次的话,那就使用JS的文字量对象!!!
    不要使用函数和this即可。
    即var a={b:"bb"};这样