从子级访问父/祖父/ /属性(不是继承)

时间:2018-05-27 16:50:50

标签: javascript oop parent-child

只是想知道以下情况的最佳做法是什么,我已经完成了搜索,但似乎只得到引用父/子继承的结果,而这不是,我不能想到另一种方式说出来!

我们说我有以下简化示例对象:

  • 地图对象(请参阅下面的编辑)
  • 引用对象,其中包含:
    • 日期对象,
    • 路线对象,其中包含:
      • 航点数组,每个包含:
        • 网站对象,包含以下属性:
          • 纬度
          • 经度

现在,如果我想计算特定地点的日出/日落时间,我需要日期,纬度和经度。目前,我的站点对象具有以下(伪代码)功能:

var Site = function() {
    var lat;
    var lng;

    var calculateSunriseSunset = function(date) {
        // do calculation with lat, lng and date
        return result;
    }
}

例如,我可能会像这样调用函数:

site.calculateSunriseSunset(quote.get('date')); // site here is a reference to a specific site object 

其中'引用'是父Quote对象的全局引用。对我来说,这是丑陋的,似乎是不好的做法(循环参考?耦合?)。

然而,我能想到的其他两个选项是:

  • 将calculateSunriseSunset移动到Quote对象并将其作为参数传递给站点和日期(但这似乎是不好的做法,因为日出和日落与特定站点相关,并且有很多这些例子分散在许多不同的对象上 - 我担心这样做,Quote对象只会变得一团糟“
  • 将构建日期的路径对象作为参数传递给路径对象,然后通过每个路径循环以设置日期更新每个站点。这看起来很混乱,特别是当日期发生变化并且整个过程必须再次完成时。

有没有更好的方法可以解决这个问题?

由于

修改

1)澄清我的意思全球参考'我的意思是我使用了以下代码:

var quote = new Quote();

其中quote在全局命名空间中定义,并且可以从任何地方调用。

2)计算出现的太阳'函数是从另一个对象调用的,一个' Map'处理与显示给用户的地图有关的所有事物的对象。它看起来有点像这样(为了清晰起见,大大简化了):

var Map = function() {
    var sites; // list of sites loaded from the server
    var leafletMap; // reference to the [Leaflet][1] map object used to do the 'heavy lifting'
    var root = this;

    showSites = function() {
        var siteLayer = L.geoJson(sites, {
            onEachFeature: function (feature, layer) {
                layer.on('click', function (e) {
                    root.openPopup(e.target.feature);
                });
             },
        }).addTo(leafletMap);
    }

    this.openPopup = function(site) {
        var popup = L.popup().setContent(site.calculateSunriseSunset(quote.get('date'))).openOn(leafletMap);
    }
}

0 个答案:

没有答案