2011-07-18 97 views
4

我無法訪問對象內部的函數。訪問javascript對象內部的函數

我的設置是這樣..

google.setOnLoadCallback(function(){$(document).ready(CareersInit);}); 

function CareersInit() 
{ 
    CAREERS = new Careers(); 
    CAREERS.init(); 
} 

function Careers() 
{ 
    this.init = function() 
    { 
     function initialize() 
     { 
      //Usual google maps stuff here 
     } 
    } 

    $('body').bind('onload', function() { 
     initialize(); 
    }); 
} 

採用這種設置,初始化不運行,但如果我把我的谷歌地圖的變量/函數出來的初始化函數,然後它的工作的,但我的理解(從谷歌文檔)是初始化應該始終是一個函數,其中包含谷歌地圖變量/函數等

即使這是正確的路要走,這將是很好找到如何訪問函數時,他們是在一個對象方法僅用於控制檯中的調試目的。我以爲

CAREERS.init.initialize(); 

會工作,但它不會。

任何幫助或建議將不勝感激。

由於

賈爾斯

回答

3

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

+0

感謝您對self.init()的幫助和提示。快速的問題,爲什麼這必須分配給一個變量? –

+0

@Giles:因爲JavaScript中的this與您可能使用的其他語言(如Java,C++,C#)中的this不同,所以在JavaScript中,this完全由*如何定義稱爲*,而不是*其中函數被定義*。當jQuery調用你的'onload'處理函數時,它會將'this'設置爲'window'對象,而不是你的'Career'實例。所以我們利用這個事實,即你已經將該處理程序定義爲構造函數調用的上下文的閉包,並使用變量來記住對正在構建的對象的引用。 (請參閱我添加的有關'this'的鏈接。) –

+0

嗯好吧,這是有道理的,我忘了jQuery的這個。感謝其他的信息,解剖和理解需要一段時間,但這非常有幫助。 –

0

initialize是內部init一個私有函數,這意味着它是不可訪問的外部init

究竟是兩次定義事物的目的是什麼?

this.init = function() 
{ 
     //Usual google maps stuff here 
} 
+0

沒有目的,我只是想知道這樣做的最佳方式,感謝您的幫助。 –