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

时间:2013-08-26 04:22:03

标签: javascript namespaces

前段时间我听说最好将代码包装在一个大对象中作为命名空间,以减少全局命名空间的混乱并促进库的导出,所以我尝试了这个。

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

它失败了,声称“foo未定义”。 在完成对象声明之前调用方法可能很糟糕,所以我移动了bar,它起作用了。

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

我觉得这会变得有点丑陋,特别是对于嵌套的命名空间等等,那么是否有任何变通方法不会让你很难同时看到所有包装器的成员?

3 个答案:

答案 0 :(得分:1)

问题在于this将等于全局背景。您需要像这样访问函数:

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

wrapper.init();

此方法非常适合将代码组织为逻辑块,因此您和未来的开发人员可以轻松地在您的javascript中找到您要查找的内容。

答案 1 :(得分:0)

使用this之类的东西将不起作用,除非包装器是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

答案 2 :(得分:0)

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

};

alert(wrapper.foo);

http://jsfiddle.net/ee8Ww/