访问javascript对象内的函数

时间:2011-07-18 10:02:58

标签: javascript jquery oop google-maps

我无法访问对象内的函数。

我的设置就是这样..

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(); 

会起作用,但事实并非如此。

非常感谢任何帮助或建议。

由于

贾尔斯

2 个答案:

答案 0 :(得分:3)

initialize函数对于您this.init所使用的函数是真正私有的。除非您做某事使其可访问,否则无法从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实例。您有Google的加载回调,调用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
    }

})();

...除了如果你只想拥有一个实例(而且你确定它不会改变),实际上根本没有构建函数的调用:< / p>

(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实例,那么很好,绝对是构造函数路径。但如果没有,如果你使用你已经拥有的对象(调用函数的执行上下文),那么就会有更少的麻烦。


偏离主题强烈建议您声明CAREERS变量。使用您现在的代码,您将成为The Horror Of Implicit Globals的牺牲品。

答案 1 :(得分:0)

initializeinit中的私有函数,这意味着它在init之外无法访问。

两次定义事物的目的究竟是什么?

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