我的同事一直在使用“new function()”和小写的“f”来定义JavaScript中的新对象。它似乎在所有主要的浏览器中都能很好地工作,并且在隐藏私有(private)变量方面似乎也相当有效。这是一个例子:
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的公共(public)属性(property)。因此someObj.foo,someObj.get_inner()和someObj.set_inner()都是公开可用的。另外,set_inner()和get_inner()是特权方法,因此它们可以通过闭包访问“内部”。
但是,我在任何地方都没有看到对此技术的任何引用。甚至道格拉斯·克罗克福德(Douglas Crockford)的JSLint也对此提示:
我们正在生产中使用这种技术,它似乎运行良好,但是我对此有些担心,因为它在任何地方都没有记录。有谁知道这是有效的技术吗?
最佳答案
我之前已经看过该技术,它有效,您正在使用函数表达式,就好像它是Constructor Function一样。
但是恕我直言,您可以使用自动调用函数表达式实现相同的功能,我真的不明白以这种方式使用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]
内部属性是如何实现的。上面的代码将产生等效的结果。