2011-07-18 95 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

没有目的,我只是想知道这样做的最佳方式,感谢您的帮助。 –