所以有这个所谓的模块模式用于创建私有成员的单身人士:
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); };
}
我认为必须有一个理由为什么没有人写这篇文章,而有大量关于模块模式的文章。这种模式有什么缺点吗?速度或浏览器兼容性可能吗?
答案 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)
编辑:实际回答你的问题 - 没有缺点,两者在功能上是等价的(都创建一个包含“私有变量”的闭包并公开暴露其他变量/方法),并具有完全相同的浏览器支持和性能特征。它只是归结为语法问题 - 基本上,你将()
实际调用此函数并获得关闭,以及是否使用new
关键字。