Javascript 在对象声明完成之前调用成员方法

Javascript 在对象声明完成之前调用成员方法,javascript,namespaces,Javascript,Namespaces,不久前,我听说将代码封装在一个大对象中作为名称空间是一种很好的做法,这样可以减少全局名称空间的混乱并方便库的导出,所以我尝试了这个方法 var wrapper = { foo: function(){ return 42; }, bar: this.foo() }; 它失败了,声称“foo没有定义”。 在完成对象声明之前调用方法可能是不好的,所以我移动了条,它成功了 var wrapper = { foo: function(){

不久前,我听说将代码封装在一个大对象中作为名称空间是一种很好的做法,这样可以减少全局名称空间的混乱并方便库的导出,所以我尝试了这个方法

var wrapper = {
    foo: function(){
        return 42;
    },
    bar: this.foo()
};
它失败了,声称“foo没有定义”。 在完成对象声明之前调用方法可能是不好的,所以我移动了条,它成功了

var wrapper = {
    foo: function(){
        return 42;
    },
};
wrapper.bar = wrapper.foo();

我觉得这可能会有点难看,尤其是在嵌套名称空间之类的情况下,那么是否有任何解决方法可以使同时查看包装器的所有成员变得不困难?

问题在于
这将等于全局上下文。您需要像这样访问函数:

var wrapper = {
    foo: function(){
        return 42;
    },
    bar: null,
    init : function() {
       // all initialization code goes here
       wrapper.bar = wrapper.foo();
    }
};

wrapper.init();

这种方法非常适合将代码组织成逻辑块,这样您和未来的开发人员就可以轻松地在javascript中找到您想要的内容。

使用
这种
方法将不起作用,除非包装器是1)一个函数,2)您实例化它以使用它:

var wrapper = function() {
  this.foo = function() { return 42; }
  this.bar = this.foo();
};

var wrapperInstance = new wrapper();
alert(wrapperInstance.bar()); // 42
wrapperInstance.foo(); // also works

Hm,Chrome声称它“不能调用undefined的方法'foo',这意味着包装器未定义?更新了代码以使其可用。此体系结构最常见的用法是包含某种init函数,该函数执行所有变量初始化。在变量将包含对DOM的引用的情况下,这可以在document onload事件中完成,即:
wrapper.bar=document.getElementById('bar')
当您想限制搜索DOMI的次数时,这很有用,假设您的意思是
警报(wrapperInstance.bar);wrapperInstance.foo(),考虑到bar不是函数,而且包装器没有成员。对于包装器来说,这似乎也太过分了,因为创建一个只使用一次的构造函数似乎很愚蠢……是的,我继续进行了相应的编辑。这没那么傻——想想单身模式吧为什么需要在声明时调用任何方法?也许您想使用立即调用函数(IEFE)。还可以查看模块模式。
var wrapper = {
foo: (function(){
    return 42;
     })()

};

alert(wrapper.foo);