如何在'模块'中组织我的代码?

时间:2011-03-13 17:14:47

标签: javascript object scope closures this

我正试图围绕组织我的代码。我的项目中有几个模块,我想组织这些模块。

关键是我想到的一切都没有成功。我目前正在考虑四个想法:

  1. 简单对象 - 由于范围问题而无效。使用this.a会有效,但this具有不同的含义,具体取决于谁调用它,因此它不可靠。例如,我曾经为WebSocket类分配了一个函数,但是当this事件调用该函数时,突然WebSocket引用WebSocket实例。我每次调用函数时都可以使用bind(foo),但我必须有另一种方法。

    var foo = {
        a: 3,
        s: function() {
            alert(a); // a doesn't exist in this scope
            alert(this.a); // 'this' isn't always foo
            alert(foo.a); // I would have to put 'foo.' before each variable
                          // reference, but I'm sure that's not the way to do it
       }
    };
    
  2. 实例 - a未定义。同样,this不可靠。

    var foo = function() {
        this.a = 3;
        this.s = function() {
            alert(a);
        };
    };
    var foo_instance = new foo();
    foo_instance.a = 4;
    foo_instance.s(); // Error: a is not defined
    
  3. 关闭实例 - 不返回任何内容;它保持undefined

    var foo = (function() {
        this.a = 3;
        this.s = function() {
            alert(a);
        };
    })();
    // foo === undefined
    
  4. 使用getter / setter关闭 - 在Chrome上运行得很漂亮,但IE不支持getter / setter。

    var foo = (function() {
        var a = 3;
        return {
            get a() { return a; },
            set a(v) { a = v; },
    
            s: function() {
                alert(a); // Doesn't work in IE as getters/setters are
                          // not supported
            }
        };
    })();
    
  5. 我如何有效地组织我的模块,以便我可以安全地以跨浏览器的方式访问属性?

    感谢。

3 个答案:

答案 0 :(得分:2)

3未定义,因为您没有返回任何内容。而不是将属性和方法分配给'this',试试这个:

var foo = (function() {
    var self = {};

    self.someProperty = someValue;

    self.someFunction = function () {

    }

    return self;
}());

foo现在将返回一个定义了属性和方法的对象。这样做你永远不会想知道“这个”实际上指的是什么。

答案 1 :(得分:1)

在我看来,您并没有真正理解this和闭包在JavaScript中是如何工作的。

请阅读boththese主题,并查看namespaces

有很多不同的方法可以实现模块,但除非你理解基础知识,否则在这里谈论它没有多大意义,所以请参阅我的链接以获得深入的解释。

答案 2 :(得分:1)

您的第一个代码段使用了一个闭包,并对应于yui library受欢迎的模式。第二种模式对应于对象的私有,公共和特权成员的概念。

我建议您阅读Douglas Crockford关于javascript private members的这篇主要文章,并选择第一个选项或第二个选项。 它们在语义上等同于

(与前两个相比,第三段和第四段片段看起来过于复杂)