2014-10-21 59 views
0

我一直在閱讀大量的問題,無法找到我的問題的答案。我已經使用JavaScript作爲程序約2年了,現在已經決定現在是時候讓我咬緊牙關,弄清楚面向對象的代碼。我已經聲明爲下面定義的對象:在另一個功能中訪問對象屬性

function Driver(driverName, startAddress){ 
    this.driverName = driverName; 
    this.address = address; 
    this.inventory = 0; 
    this.latCoord = 0; 
    this.lngCoord = 0; 
} 

,並通過使用Driver.prototype.functionName = function(){};語法專爲驅動程序對象的功能。這一切都很好。

然後我聲明瞭一個全局變量FULL_LIST = [];並有一個函數如下:

function initialize(){ 
    // init geocoder 
    GEOCODER = new google.maps.Geocoder(); 

    // init map 
    var latlng = new google.maps.LatLng(-34.397, 150.644); 
    var mapOptions = { 
     zoom: 8, 
     center: latlng 
    } 
    MAP = new google.maps.Map($('#map-canvas'), mapOptions); 

    // init list of all drivers 
    $.ajax({ 
     type: "POST", 
     url: "actions/getDriverInfo.php", 
     dataType: "json", 
     success: function(data){ 
      var names = data.names, 
       addresses = data.addresses; 
      for (var i = names.length - 1; i >= 0; i--) { 
       var driver = new Driver(names[i], addresses[i]); 
       FULL_LIST.push(driver); 
      }; 
     } 
    }); 

    run(); 
} 

我最大的問題來自於我想要做像下面的函數的事實:

function run(){ 
    // plot points 
    var bounds = new google.maps.LatLngBounds(); 
    for(var i=0; i<FULL_LIST.length; i++){ 
     var node = FULL_LIST[i]; 
     var marker = new google.maps.Marker({ 
      map: MAP, 
      position: { 
       node.latCoord, 
       node.lngCoord 
      }, 
      title: node.driverName 
     }); 
     bounds.extend({ 
      node.latCoord, 
      node.lngCoord 
     }); 
     MAP.fitBounds(bounds); 
    } 
} 

google.maps.event.addDomListener(window, 'load', initialize); 

因爲run()無法知道node是一個驅動程序,我不認爲它期望.latCoord,我在該行上得到"TypeError unexpected ."。有沒有辦法將node作爲驅動程序?沒有更大規模的命名空間包裝它是否有問題?或者我完全搞砸了這個問題?

感謝@fgb的洞察力,認爲這個問題是谷歌地圖語法問題。對於那些指出AJAX的異步效應的人,我知道這與我所遇到的問題無關。爲了簡單起見,我剪掉了大量的代碼,然後我排除了一些其他的ajax調用,並將run() fxn刪除。

但是,我原來的問題仍然存在,儘管有所改變。爲什麼這個工作?我會認爲,因爲對象和它的屬性被定義在一個不同的函數中,所以run函數不會知道.latCoord是一個對象的潛在屬性,因爲系統在任何時候都不知道期望得到Driver對象。這不會是一個像c + +的大問題?

+0

這一切都必須發生在「成功」,因爲AJAX是異步的。 – PHPglue 2014-10-21 23:03:47

+0

在ajax成功函數完成之前調用'run()',嘗試在回調內移動'run' – andrew 2014-10-21 23:04:09

+1

是不是'{node.latCoord,node.lngCoord}'語法錯誤?嘗試'{lat:node.latCoord,lng:node.lngCoord}' – fgb 2014-10-21 23:08:10

回答

1

你可以在其他地方定義一個構造函數,但是一旦你用它創建了一個對象,你最終會得到一個獨立的對象。該對象知道它具有哪些屬性,並且不需要在任何地方單獨定義。這與C++等語言不同,您需要訪問類定義才能使用實例。

JavaScript中的類型比其他一些語言更靈活。它具有duck typing的概念,其中基於它們如何使用而不是嚴格的類型定義來隱式定義對象的類型。

因此,您可以將{ latCoord: 5, lngCoord: 10, driverName: 'Name' }之類的對象字面值放入FULL_LIST中,run函數將以與構造函數創建的對象相同的方式使用它們。

相關問題