2013-08-27 44 views
0

我是JavaScript新手,我試圖創建一個MapManager類來實例化其他一些管理器,這些管理器將管理Google地圖的不同方面;如標記,不同的視圖等將「this」傳遞給在類中實例化的類

我遇到的問題是,當我試圖將「this」作爲參數傳遞給其他類,MapManager正在實例化時,它只傳遞一個空的實例MapManager(JavaScript控制檯顯示「MapManager {}」並調用MapManager類的內部聲明的函數時,我得到的錯誤。)

var MapManager = function(map) { 

    var markerManager = new MarkerManager(this); 
    var viewManager = new ViewManager(this); 

    var getMarkerManager = function() { 
     return markerManager; 
    } 

    var getViewManager = function() { 
     return viewManager; 
    } 

    var getMap = function() { 
     return map; 
    } 

    return { 
     getMarkerManager: getMarkerManager, 
     getViewManager: getViewManager, 
     getMap: getMap 
    } 

} 

var MarkerManager = function(mapManager) { 

    var map = mapManager.getMap(); 
    var markers = {}; 

    var createMarker = function(id, latitude, longitude) { 

     var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(latitude, longitude), 
     map: map, 
     animation: google.maps.Animation.DROP 
     }); 

     marker.set("id", id); 
     markers[id] = marker; 

     var listener = new google.maps.event.addListener(marker, "click", function() { 
      mapManager.getViewManager().setZoomToClient(id); 
     }; 
    }; 

    return { 
     createMarker: createMarker 
    }; 
} 

var ViewManager = function(mapManager) { 

    var map = mapManager.getMap(); 
    var setBoundView = function() { 
    var bounds = new google.maps.LatLngBounds(); 
    var markers = mapManager.getMarkerManager.getMarkers(); 
    for(id in markers) { 
    bounds.extend(markers[id].getPosition()); 
    } 
    map.fitBounds(bounds); 
    }; 

    return { 
    setBoundView: setBoundView 
    }; 
} 

我不是能夠通過在JavaScript「這個」依賴注入?如果您能夠比較JavaScript中「this」與其他語言之間的差異,那麼知道我熟悉PHP,Java和Python可能會有所幫助。

+0

不解決您的問題,但向您展示如何使用原型和原因。 JS不會真的支持私有變量,我通常遠離使用它們的模式。可以在原型上有「私有」方法,但我從來沒有使用它們:http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR

回答

2

你遇到的問題是你在構造函數中使用的this實際上並不是你最終構造的東西。您正在使用特定的Javascript模式(您可能已經閱讀過有關實現「私有」成員的好方法),當您嘗試使用該語言的某些功能時會導致出現奇怪的事情。 [0]

在構造函數執行期間,this實際上指向的是MapManager的實例。但是,因爲您從構造函數返回對象,所以對外部引用的MapManager實例是對返回的對象的引用,這與您在構造函數中引用的this不同。

有一對夫婦的方式來解決此問題:

  1. 如果你只是刪除您的構造函數的return { ... };並替換您在對象如this.functionName = functionName;在做任務,你應該罰款。

  2. 如果你想要做一個更標準JavaScriptish的方式,你可以把thismap,把你方法上MapManager.prototypeThis SO question解釋瞭如何做到這一點,以及更多關於這兩個選項的區別。

此外,如果你有興趣,使得界定古典OO類更容易輕量級庫,我建議考慮看看Classy

[0]我對這種模式有些置疑:我認爲它是邪惡的,邪惡的,破碎的,不應該被使用。它以特別令人沮喪的方式打破了語言的基本方面(如原型鏈)。

+0

同意這種模式是邪惡的。嘗試克隆這些對象(用var定義的所有東西只能在實例中訪問)。嘗試繼承,重寫和調用super.someMethod(這是一個痛苦)。它使用更多的CPU來創建更多的內存來存儲。所有這些麻煩只是爲了私人實例varialbes(可以在JS中執行「私人」功能,當您使用函數返回閉包但更重時設置原型)。我不會使用「私有」,只是用_somePrivate標記它們。 – HMR

+0

這正是我所做的 - 使它變得醜陋(並且衆所周知是私有的),並且人們使用它的可能性要小得多。如果他們確實使用了它(他們可能有充足的理由這麼做),他們至少會知道他們這樣做是違反建議的。 – pkh

0

您不應該將this作爲參數傳遞給類的instance,有更好的方法來實現它。

首先,PHPJavascript之間最重要的不同在於PHP中有一個繼承,您不需要將引用傳遞給父類。

在javascript中這是一個有點複雜,因爲JavaScript不會繼承自然支持,你可以閱讀我最喜歡的知識來源:

(解釋如何實現它) http://ejohn.org/blog/simple-javascript-inheritance/

返回你的問題,你可以通過使用

Function.prototype.call

通過this給你的函數210

Function.prototype.bind - 支持IE 9

主要缺點版本中那些你失去參考你的真實的類此方法,什麼再次回到我的我的第一款結合,你應該實現繼承。

相關問題