`新功能()`与在JavaScript小写字母“f”`新功能()`与在JavaScript小写字母“

2019-05-09 02:55发布

我的同事一直使用“新功能()”用小写字母“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的抱怨吧:

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

我们在生产中使用这种技术,它似乎运作良好,但我有点担心,因为它不记录任何地方。 有谁知道,如果这是一个有效的技术?

Answer 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]内部属性。

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



Answer 2:

您的代码只是类似于少怪异构造

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

    ...
};
var someObj = new Foo;


Answer 3:

为了澄清某些方面做出道格拉斯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中,而不是它的实例。 毕竟它只是一个警告,而不是一个错误。



文章来源: `new function()` with lower case “f” in JavaScript