2011-03-04 39 views
4

所以,我想擴展一個谷歌地圖類,特別是google.maps.OverlayView(在v3中)。這樣做香草js方式完全有效。原型Class.create沒有正確的子類

POIOverlay = function(marker, poi, type) 
    { 
     this._marker = marker; 
     this._poi = poi; 
     this._type = type; 
     this._div = null; 
     this.latlng_ = marker.getPosition(); 
     this._map = marker.getMap(); 
     this._offsetVertical = -195; 
     this._offsetHorizontal = 0; 
     this._height = 165; 
     this._width = 266; 
    } 
    POIOverlay.prototype = new google.maps.OverlayView(); 
    POIOverlay.prototype.create = function() 
    { 
     console.log(this) 
    } 
    POIOverlay.prototype.draw = function() 
    { 
     //stuff 
    } 

然而,這樣做原型的方式,無法添加的父類方法的任何:

POIOverlay = Class.create(new google.maps.OverlayView(), { 
    initialize : function(marker, poi, type) 
    { 
     this._marker = marker; 
     this._poi = poi; 
     this._type = type; 
     this._div = null; 
     this.latlng_ = marker.getPosition(); 
     this._map = marker.getMap(); 
     this._offsetVertical = -195; 
     this._offsetHorizontal = 0; 
     this._height = 165; 
     this._width = 266; 
    }, 
    create : function() 
    { 
     if(this._div) return; 
     console.log(this); 
    }, 
    draw : function() 
    { 
     //stuff 
    } 
}); 

這裏是實例/使用類的代碼:

try 
    { 
     poio = new POIOverlay(marker,poi,type); 
    } 
    catch(e) 
    { 
     console.log(e); 
    } 

    google.maps.event.addListener(marker, 'click', 
     poio.draw.bind(poio) 
    ); 

在第一個示例中,控制檯使用父級和子級方法/屬性記錄對象。在第二個示例中,控制檯記錄一個沒有父屬性/方法的對象。

顯然,這是不是太什麼大不了的事,但我在任何人想知道其他人碰到這個問題,如果它是很容易糾正。我正在使用原型1.7。

+0

不知父類必須是一個由原型自己的系統中創建... – Pointy 2011-03-04 20:11:57

回答

2

超類參數需要是一個正確的原型「類」 - 請記住,類並不存在於JavaScript中。 JavaScript有幾種經典的繼承模式,您應該可以通過手動代理構造函數和原型來獲取原型鏈(包括對父類「類」及其原型的引用)。

prototype's class.js

[[Class.create]]接受兩個類型的參數。如果第一個參數是 a [[Class]],它將用作新類的超類,並且它的所有方法都將被繼承。否則,傳遞的任何參數都將被視爲 對象,並且它們的方法將作爲新類的實例方法 複製(「混入」)。