我的同事一直使用“新功能()”用小写字母“f”来定义在JavaScript中的新对象。 这似乎在所有的主流浏览器很好地工作,同时也似乎是在隐藏私有变量相当有效。 下面是一个例子:
var someObj = new function () {
var inner = 'some value';
this.foo = 'blah';
this.get_inner = function () {
return inner;
};
this.set_inner = function (s) {
inner = s;
};
};
只要“本”时,它成为someObj中的公共属性。 所以someObj.foo,someObj.get_inner()和someObj.set_inner()都可以公开。 此外,set_inner()和get_inner()是特权的方法,所以它们必须通过封闭访问“内部”。
但是,我还没有看到这种技术的任何引用任何地方。 即使道格拉斯Crockford的JSLint的抱怨吧:
我们在生产中使用这种技术,它似乎运作良好,但我有点担心,因为它不记录任何地方。 有谁知道,如果这是一个有效的技术?
我以前见过这种技术,它是有效的,您使用的是函数表达式就好像它是一个构造函数 。
但恕我直言,你可以实现与自动调用函数表达式一样,我实在看不出使用的点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
运营商来创建新的对象实例,建立[[Prototype]]
内部属性,你可以看到这是由制造[Construct]
内部属性。
上面的代码将产生等效的结果。
您的代码只是类似于少怪异构造
function Foo () {
var inner = 'some value';
this.foo = 'blah';
...
};
var someObj = new Foo;
为了澄清某些方面做出道格拉斯Crockford的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表达(...)为一个函数/构造。 它看起来像这样:新的(函数(){...})()。 所以,如果我们忽略结束括号如例2中,表达仍然是一个有效的构造函数调用,看起来像例4。
道格拉斯Crockford的JSLint的“认为”你要的功能分配给someObj中,而不是它的实例。 毕竟它只是一个警告,而不是一个错误。