JavaScript中使用小写“f”的新函数()

我的同事一直在用“f”的小写“new function()”来定义JavaScript中的新对象。 它似乎在所有主stream浏览器中都能正常工作,并且在隐藏私有variables方面似乎也相当有效。 这是一个例子:

var someObj = new function () { var inner = 'some value'; this.foo = 'blah'; this.get_inner = function () { return inner; }; this.set_inner = function (s) { inner = s; }; }; 

只要“this”被使用,它就成为someObj的公共财产。 所以someObj.foo,someObj.get_inner()和someObj.set_inner()都是公开的。 另外,set_inner()和get_inner()是特权方法,所以它们可以通过闭包访问“内部”。

但是,我还没有看到任何地方提及这种技术。 就连道格拉斯·克罗克福德的JSLint也抱怨道:

  • 奇怪的build筑。 删除“新”

我们在生产中使用这种技术,似乎运行良好,但我有点担心,因为它没有logging在任何地方。 有谁知道这是否是一种有效的技术?

我已经看过这种技术,它是有效的,你正在使用一个函数expression式,就好像它是一个构造函数 。

但恕我直言,你可以实现与自动调用函数expression式一样,我真的没有看到这样使用new操作符的重点:

 var someObj = (function () { var instance = {}, inner = 'some value'; instance.foo = 'blah'; instance.get_inner = function () { return inner; }; instance.set_inner = function (s) { inner = s; }; return instance; })(); 

new运算符的目的是创build新的对象实例,设置[[Prototype]]内部属性,您可以看到[Construct]内部属性是如何实现的。

上面的代码将产生一个等效的结果。

你的代码和更奇怪的结构类似

 function Foo () { var inner = 'some value'; this.foo = 'blah'; ... }; var someObj = new Foo; 

为了澄清一些方面,使道格拉斯·克罗克福德的JSLint不要抱怨你的代码,下面是一些实例化的例子:

 1. o = new Object(); // normal call of a constructor 2. o = new Object; // accepted call of a constructor 3. var someObj = new (function () { var inner = 'some value'; this.foo = 'blah'; this.get_inner = function () { return inner; }; this.set_inner = function (s) { inner = s; }; })(); // normal call of a constructor 4. var someObj = new (function () { var inner = 'some value'; this.foo = 'blah'; this.get_inner = function () { return inner; }; this.set_inner = function (s) { inner = s; }; }); // accepted call of a constructor 

在例子3.expression式(…)中,value是一个函数/构造函数。 它看起来像这样:new(function(){…})()。 所以如果我们像例子2那样省略结束括号,expression式仍然是一个有效的构造函数调用,看起来像例子4。

道格拉斯·克罗克福德(Douglas Crockford)的JSLint“认为”你想把这个function分配给某个对象,而不是它的实例。 毕竟这只是一个警告,不是一个错误。