访问另一个函数中的对象属性

时间:2014-10-21 22:55:57

标签: javascript oop

我一直在阅读大量的问题,但找不到问题的答案。我已经使用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(){};语法为Driver对象构建了函数。一切都很好。

然后我声明一个全局变量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的洞察力,认为该问题是Google地图语法问题。对于那些指出AJAX的异步效应的人,我知道这与我遇到的问题无关。为了简单起见,我删除了大量的代码,并且我排除了许多其他的ajax调用并将run() fxn放入其中。

但是,我原来的问题仍然存在,尽管有些改变。为什么这样做?我原以为,因为对象及其属性是在不同的函数中定义的,run函数不知道.latCoord是对象的潜在属性,因为系统在任何时候都不知道期待一个Driver对象。这不会是像c ++这样的大问题吗?

1 个答案:

答案 0 :(得分:1)

您可以在其他地方定义构造函数,但是一旦使用它创建了一个对象,您最终会得到一个自包含的对象。该对象知道它具有哪些属性,并且不需要在任何地方单独定义。这与c ++之类的语言不同,在这些语言中,您需要访问类定义才能使用实例。

JavaScript中的类型比其他语言更灵活。它具有duck typing的概念,其中对象的类型是根据它们的使用方式隐式定义的,而不是严格的类型定义。

所以你可以将{ latCoord: 5, lngCoord: 10, driverName: 'Name' }之类的对象文字输入到FULL_LIST中,而run函数将使用它们与构造函数创建对象的方式相同。