< p >
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()
{
};
$('body').bind('onload', function() {
self.init();
});
}
然而,您的代码试图两次初始化 Careers
实例。您有 Google 的加载回调调用 jQuery 的 ready
函数,该函数然后调用您的 CareersInit
函数,该函数调用 CAREERS.init
。但是您还计划了一个单独的页面加载回调来调用 Careers
构造函数。(那个可能会运行,也可能不会,这取决于 Google 何时触发 setOnLoadCallback
回调。)
我会摆脱其中一个对 init
的调用。
在另一个答案的评论中,您说想知道最好的方法是什么。我需要了解更多关于您正在做什么的信息,但我可能会这样做:
(function() {
var CAREERS;
google.setOnLoadCallback(function(){
$(document).ready(CareersInit);
});
function CareersInit()
{
CAREERS = new Careers();
CAREERS.init();
}
function Careers()
{
}
Careers.prototype.init = Careers_init;
function Careers_init()
{
}
})();
......除非你只需要一个实例(并且确定不会改变),否则根本不需要构造函数:
(function() {
var someData;
google.setOnLoadCallback(function(){
$(document).ready(CareersInit);
});
function CareersInit()
{
someData = "some value";
}
})();
在这里,函数作用域是单个实例;不需要单独的构造函数,
使用this
玩游戏等。请注意,我们没有创建任何全局变量,
someData
被限定在匿名函数中。解释器调用该函数时,我们得到了单个对象。
如果您需要多个
Career
实例,那么很好,请确保使用构造函数路线。但如果不需要,如果您使用已经拥有的对象(函数调用的执行上下文),则会少费事。
离题:强烈建议声明你的CAREERS
变量。以你现在的代码为例,你正在成为隐式全局变量的恐怖的牺牲品。
this
不像你可能使用过的其他语言中的this
,比如 Java、C++、C# 等等。在 JavaScript 中,this
完全是由函数被调用的方式定义的,而不是函数的定义位置。当 jQuery 调用你的onload
处理程序时,它会将this
设置为window
对象,而不是你的Career
实例。所以我们利用了这个事实,你已经将处理程序定义为一个闭包,它位于构造函数调用的上下文中,并使用变量来记住对正在构造的对象的引用。(有关this
的链接请参见我添加的链接。) - T.J. Crowderthis
不是jQuery的,而是JavaScript的。jQuery使用它的方式与任何JavaScript代码一样,因为JavaScript使我们对其有如此多的控制权。 :-) - T.J. CrowdersomeData
,我假设你需要有一些持久状态。如果不需要,那就在作用域函数中不要有任何变量。当我说调用函数就是对象时,我是字面意思:每次调用函数都会创建一个执行上下文,其中(手势)保存了函数内的变量等内容。只要有任何东西引用它(如回调函数),即使函数已经返回,该上下文仍然存在。更多信息请参见:http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html - T.J. Crowder