Функция 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
.С вашим текущим кодом вы становитесь жертвой Ужаса неявных глобалов .