'новая функция ()' с нижним регистром “f” в JavaScript

Мой коллега использовал "новую функцию ()" с нижним регистром "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 () являются привилегированными методами, таким образом, у них есть доступ к "внутреннему" посредством закрытий.

Однако я не видел ссылки на эту технику нигде. Даже JSLint Douglas Crockford жалуется на это:

  • странная конструкция. Удалите 'новый'

Мы используем эту технику в производстве, и это, кажется, работает хорошо, но я немного беспокоюсь об этом, потому что это не документируется нигде. Кто-либо знает, является ли это допустимой техникой?

106
задан alex 28 February 2013 в 06:16
поделиться

2 ответа

Я видел эту технику раньше, она действительна, вы используете выражение функции, как если бы это была функция-конструктор.

Но IMHO, вы можете добиться того же самого с помощью выражения функции с автоматическим вызовом, я не вижу смысла использовать оператор 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] внутреннего свойства.

Приведенный выше код даст эквивалентный результат.

64
ответ дан 24 November 2019 в 03:53
поделиться

Ваш код просто похож на менее странную конструкцию

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

    ...
};
var someObj = new Foo;
15
ответ дан 24 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: