一尘不染

JavaScript中的“ new function()”,其小写字母“ f”

javascript

我的同事一直在使用“ new function()”和小写的“
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;
        };
    };

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

但是,我在任何地方都没有看到对此技术的任何参考。甚至道格拉斯·克罗克福德(Douglas Crockford)的JSLint也对此抱怨:

  • 奇怪的建设。删除“新”

我们正在生产中使用这种技术,它似乎运行良好,但是我对此有些担心,因为它在任何地方都没有记录。有人知道这是否有效吗?


阅读 279

收藏
2020-05-01

共1个答案

一尘不染

我之前已经看过该技术,它是有效的,您正在使用函数表达式,就好像它是构造函数一样。

但是恕我直言,您可以使用自动调用函数表达式来实现相同的功能,我真的不明白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]内部属性是如何实现的。

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

2020-05-01