gpt4 book ai didi

javascript - js单例 - 如何避免通过命名空间访问类成员

转载 作者:行者123 更新时间:2023-11-30 06:01:31 24 4
gpt4 key购买 nike

我正在尝试改进我的 Javascript 编码风格,并且一直在阅读它对命名空间的好处。

然而,我似乎无法在任何我想使用的地方使用“this”关键字——相反,我只能从匿名函数中通过命名空间(在本例中为“oldMap”)访问我的类属性。这意味着我不能在不更改代码的情况下更改命名空间 ID——这似乎可能是错误的。

这是我构建的类 - 但它实际上似乎可以正常工作。 (对不起,它很长)。

感谢收到任何关于我做对/做错的建议/提示。谢谢

var oldMap = {

map : null,

center : {lat:50, lng:20, zoom:3},

drawn : false,

data : {},

divId : "oldMap",

url : "php/getMapData.php",

infowindow : new google.maps.InfoWindow({
size: new google.maps.Size(150,50)
}),

init : function () {

if (!this.drawn){
$.getJSON(
this.url,
function(d){
if(d){
$.extend(oldMap.data,d);

var latlng = new google.maps.LatLng(oldMap.center.lat, oldMap.center.lng);
var myOptions = {
zoom: oldMap.center.zoom,
center: latlng,
mapTypeId: google.maps.MapTypeId.TERRAIN
};

// create the map
map = new google.maps.Map(document.getElementById("oldMap"),myOptions);

// create the legend
var legendDiv = document.createElement('DIV');
legendDiv.innerHTML = '<div id="legend"><img src="images/markers/legend-blur.png"></div>';
map.controls[google.maps.ControlPosition.TOP_LEFT].push(legendDiv);

google.maps.event.addListener(map, 'click', function() {
infowindow.close();
});

// Set the info window html template
var infoWindowTemplate = "<div id='balloon'>{{#url2}}<img src='{{url2}}' />{{/url2}}<h2>{{project_name}}</h2><p><b>Amount</b> &euro; {{cost}}</p><p><b>Country</b> {{country}}</p><p><b>Year</b> {{year}}</p><p><b>Project Type</b> {{project_type}}</p><p>{{description}}</p>{{#url}}<p><a target='_blank' href='{{url}}'>More info</a></p>{{/url}}</div>"

// loop through the projects
for(var m in oldMap.data) {

// if the project has a marker type defined
if (oldMap.data[m].marker) {

// point
var point = new google.maps.LatLng(oldMap.data[m].lat, oldMap.data[m].longtd);

// create HTML for info window
var infoHtml = Mustache.to_html(infoWindowTemplate, oldMap.data[m]);

// icon
var icon = new google.maps.MarkerImage(
"images/markers/33px/" + oldMap.data[m].marker + ".png",
new google.maps.Size(33,33)
);

// create a marker for this project
var marker = oldMap.createMarker(point,infoHtml,icon);
}
}

oldMap.drawn = true;
}
}
)
}
},


createMarker : function (latlng, html, icon) {

// create the marker
var marker = new google.maps.Marker({
position: latlng,
icon: icon,
map: map,
zIndex: Math.round(latlng.lat()*-100000)<<5
});

// open info window when marker clicked
google.maps.event.addListener(marker, 'click', function() {
oldMap.infowindow.setContent(html);
oldMap.infowindow.open(map,marker);
});
}

};

最佳答案

直接在对象上的函数的第一行应该是...

function () {
var that = this;
...
}

然后,在您的内部函数中,将对 this 的引用与 that 交换。

这是因为内部函数的this 指向window

关于javascript - js单例 - 如何避免通过命名空间访问类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8176307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com