2014-10-21 62 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函数将以与构造函数创建的对象相同的方式使用它们。

相关问题