Мой коллега использовал "новую функцию ()" с нижним регистром "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 жалуется на это:
- странная конструкция. Удалите 'новый'
Мы используем эту технику в производстве, и это, кажется, работает хорошо, но я немного беспокоюсь об этом, потому что это не документируется нигде. Кто-либо знает, является ли это допустимой техникой?
Я видел эту технику раньше, она действительна, вы используете выражение функции, как если бы это была функция-конструктор.
Но 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]
внутреннего свойства.
Приведенный выше код даст эквивалентный результат.
Ваш код просто похож на менее странную конструкцию
function Foo () {
var inner = 'some value';
this.foo = 'blah';
...
};
var someObj = new Foo;