【问题标题】:access a function inside a javascript object访问 javascript 对象中的函数
【发布时间】:2011-10-07 13:24:19
【问题描述】:

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

我的设置是这样的..

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

会起作用,但不会。

任何帮助或建议将不胜感激。

谢谢

贾尔斯

【问题讨论】:

    标签: javascript jquery oop google-maps


    【解决方案1】:

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

    ...除了如果您只拥有 一个 实例(并且您确定这不会改变),则根本不需要构造函数:

    (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 的牺牲品。

    【讨论】:

    • 感谢有关 self.init() 的帮助和好的提示;快速的问题,为什么必须将其分配给变量?
    • @Giles:因为 JavaScript 中的 this 与您可能使用过的其他一些语言中的 this 不同,例如 Java、C++、C#... 在 JavaScript 中,this 被定义完全取决于如何调用函数,而不是定义函数的位置。当 jQuery 调用您的 onload 处理程序时,它将设置 thiswindow 对象,而不是您的 Career 实例。因此,我们利用您已经将该处理程序定义为构造函数调用上下文的闭包这一事实,并使用变量来记住对正在构造的对象的引用。 (见我添加的关于this的链接。)
    • 嗯,是的,这是有道理的,我忘记了 jQuery 的这个。感谢您提供其他信息,剖析和理解需要一段时间,但这非常有帮助。
    • @Giles:不用担心,很高兴有帮助。请注意,this 不是 jQuery,而是 JavaScript。 jQuery 以任何 JavaScript 代码的方式使用它,因为 JavaScript 让我们可以控制它。 :-)
    • 我刚刚阅读了更多关于构造函数的内容,所以它开始变得更有意义了。我肯定只会有一个职业实例,所以我会选择你提供的第二个例子。我不太清楚你所说的“我们的数据”是什么意思;函数 is 是单个对象'以及为什么要设置 'someData' 变量,是否可以访问其他函数等?在我当前的 CareersInit 的 this.init 函数中,我有所有常用的变量和函数来设置谷歌地图,例如 mapoptions 和地理编码函数,所以我要把所有这些都放在“someData”变量中吗?谢谢
    【解决方案2】:

    initializeinit 内部的私有函数,这意味着它在init 外部是不可访问的。

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

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

    【讨论】:

    • 没有目的,我只是想知道最好的方法,谢谢帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多