的initialize
功能是真正私有的,以你在this.init
把功能。除非您採取措施使其可訪問,否則無法從外部訪問該功能。
但我不認爲你需要一個間接的額外層:
google.setOnLoadCallback(function(){$(document).ready(CareersInit);});
function CareersInit()
{
CAREERS = new Careers();
CAREERS.init();
}
function Careers()
{
var self = this;
this.init = function()
{
//Usual google maps stuff here
};
$('body').bind('onload', function() {
self.init();
});
}
另外,雖然,你的代碼試圖兩次初始化Careers
實例。你有谷歌的負載回調調用jQuery的ready
函數,然後調用您的CareersInit
函數,它調用CAREERS.init
。但你也有Careers
結構調度一個單獨的頁面加載回調。 (這個可能運行也可能不運行,這取決於Google何時觸發setOnLoadCallback
回調。)
我會擺脫init
的其中一個調用。
在對另一個答案的評論中,你說過你想知道什麼是最好的方法。我必須知道更多關於你在做什麼,但我可能會這樣做:
(function() {
// Our single Careers instance
var CAREERS;
// Ask Google to call us when ready
google.setOnLoadCallback(function(){
// Just in case Google is ready before the DOM is,
// call our init via `ready` (this may just call
// us immediately).
$(document).ready(CareersInit);
});
// Initialize our single instance
function CareersInit()
{
CAREERS = new Careers();
CAREERS.init();
}
// Constructor
function Careers()
{
}
// Career's init function
Careers.prototype.init = Careers_init;
function Careers_init()
{
//Usual google maps stuff here
}
})();
...不同之處在於,如果你打算只是有一個實例(和你確定這不會改變),真的沒有呼籲一個構造函數都:
(function() {
// Our data; the function *is* the single object
var someData;
// Ask Google to call us when ready
google.setOnLoadCallback(function(){
// Just in case Google is ready before the DOM is,
// call our init via `ready` (this may just call
// us immediately).
$(document).ready(CareersInit);
});
// Initialize our single instance
function CareersInit()
{
someData = "some value";
}
})();
在那裏,功能範圍是單個實例;不需要單獨的構造函數,playing games with this
等。請注意,我們沒有創建任何全局變量,someData
被限定爲匿名函數。口譯員對該功能所做的調用是我們的單個對象。
如果你打算需要多個Career
實例,那麼很好,絕對要去構造函數route。但是,如果不使用,那麼如果使用已有的對象(對函數的調用的執行上下文),則會涉及更少的麻煩。
題外話:強烈建議聲明你CAREERS
變量。現在,您的代碼就像是The Horror Of Implicit Globals。
感謝您對self.init()的幫助和提示。快速的問題,爲什麼這必須分配給一個變量? –
@Giles:因爲JavaScript中的this與您可能使用的其他語言(如Java,C++,C#)中的this不同,所以在JavaScript中,this完全由*如何定義稱爲*,而不是*其中函數被定義*。當jQuery調用你的'onload'處理函數時,它會將'this'設置爲'window'對象,而不是你的'Career'實例。所以我們利用這個事實,即你已經將該處理程序定義爲構造函數調用的上下文的閉包,並使用變量來記住對正在構建的對象的引用。 (請參閱我添加的有關'this'的鏈接。) –
嗯好吧,這是有道理的,我忘了jQuery的這個。感謝其他的信息,解剖和理解需要一段時間,但這非常有幫助。 –