模块模式与匿名构造函数的实例

时间:2009-10-08 07:22:36

标签: javascript singleton

所以有这个所谓的模块模式用于创建私有成员的单身人士:

var foo = (function () {
    var _foo = 'private!';
    return {
        foo: function () { console.log(_foo); },
        bar: 'public!'
    }
})();

我自己也找到了这种方法,但没有看到任何关于的文字:

var foo = new function () {
    var _foo = 'private!';
    this.bar = 'public!';
    this.foo = function () { console.log(_foo); };
}

我认为必须有一个理由为什么没有人写这篇文章,而有大量关于模块模式的文章。这种模式有什么缺点吗?速度或浏览器兼容性可能吗?

4 个答案:

答案 0 :(得分:12)

在这种情况下,您似乎只使用“class”的一个实例对象 。所以可能想看看Douglas Crockford对putting new directly in front of function的看法:

  

通过使用 new 来调用该函数,该对象将保留一个毫无价值的prototype对象。这浪费了记忆,没有抵消优势。如果我们不使用new,我们不会将浪费的原型对象保留在链中。因此,我们将使用()。

以正确的方式调用工厂函数

所以根据着名的雅虎javascript架构师!你应该使用第一种方法,你有他的理由。

答案 1 :(得分:3)

或多或少,他们会给你相同的结果。这只是你想要采取哪条道路的问题。

第一个可能更受欢迎,因为它只是两种已经常见的模式的混合:

(function closure() {
    var foo = 'private';
    /* ... */
}())

var singleton = {
    bar : 'public'
};

然而,prototype链接将是第二个模式的好处,因为它有自己的构造函数。

var singleton = new function Singleton() { };
assert(singleton.constructor !== Object);

singleton.constructor.prototype.foo = 'bar';
assert(singleton.foo === 'bar');

答案 2 :(得分:1)

我认为两者之间没有任何实质性差异。我更喜欢后者,因为它的标点符号杂乱得多。

另一方面,“模块模式”方法似乎是最常见的,并且正在成为众所周知的模式(由于JQuery的增加)。坚持这种公认的模式可能更好,不是因为它比其他方法更具技术价值,而只是因为它可能更容易辨认(尽管标点很重)。

答案 3 :(得分:1)

道格拉斯·克罗克福德writes关于第二个问题。正如格雷格在评论中所说的那样,我认为这很常见,我过去也曾经使用它。

编辑:实际回答你的问题 - 没有缺点,两者在功能上是等价的(都创建一个包含“私有变量”的闭包并公开暴露其他变量/方法),并具有完全相同的浏览器支持和性能特征。它只是归结为语法问题 - 基本上,你将()实际调用此函数并获得关闭,以及是否使用new关键字。

相关问题