получить доступ к функции внутри объекта JavaScript - PullRequest
4 голосов
/ 18 июля 2011

У меня проблемы с доступом к функции внутри объекта.

Моя установка как таковая ..

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

При этой настройке инициализация не запускается, но если я берумои переменные / функции карт Google вне функции инициализации, тогда это работает, но я понимаю (из документации Google), что инициализация всегда должна быть функцией, которая содержит переменные / функции карт Google и т. д.

Даже если этоправильный путь - было бы здорово узнать, как получить доступ к функциям, когда они находятся внутри метода объектов, только для целей отладки в консоли.Я думал, что

CAREERS.init.initialize(); 

будет работать, но это не так.

Буду признателен за любую помощь или совет.

Спасибо

Джайлс

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Функция 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";
    }
})();

Там область действия функции равна единичный случай;нет необходимости в отдельных функциях конструктора, играть в игры с this и т. д. Обратите внимание, что мы не создаем глобальные переменные, someData ограничено анонимной функцией.Вызов, который интерпретатор делает для этой функции , является нашим единственным объектом.

Если вам когда-нибудь понадобится более одного Career экземпляра, тогда отлично, определенно перейдите к функции конструкторамаршрут.Но если нет, то здесь гораздо меньше суеты, если вы используете уже имеющийся объект (контекст выполнения вызова функции).


Вне темы : Настоятельно рекомендуем объявить переменную CAREERS.С вашим текущим кодом вы становитесь жертвой Ужаса неявных глобалов .

0 голосов
/ 18 июля 2011

initialize является частной функцией внутри init, что означает, что она недоступна снаружи init.

Какова цель определения вещей дважды?

 this.init = function()
 {
         //Usual google maps stuff here
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...