Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Одиночки. В чем разница? (https://javascript.ru/forum/misc/1268-odinochki-v-chem-raznica.html)

Snipe 02.06.2008 11:58

Одиночки. В чем разница?
 
Одиночки.
Есть ли разница и если есть, то в чем она заключается?
Раз:
var NewObject = {};
(function() {
  var privateStr = 'Я приватная';
  NewObject = {
    methodX: function() {
      alert(privateStr);
    }
  }
})
NewObject.methodX();

Два:
var NewObject = new function() {
  var privateStr = 'Я приватная';
  this.methodX = function() {
    alert(privateStr);
  }
}
NewObject.methodX();

tenshi 02.06.2008 12:18

второй код короче.
но оба бестолковы.. не стоит использовать замыкания для сокрытия состояния объекта. от этого больше неудобств, чем пользы.

Snipe 02.06.2008 12:23

Цитата:

Сообщение от tenshi
второй код короче.
но оба бестолковы.. не стоит использовать замыкания для сокрытия состояния объекта. от этого больше неудобств, чем пользы.

А как тогда прятать не нужные мне в глобальной области видимости элементы?

Kolyaj 02.06.2008 13:11

Цитата:

Сообщение от Snipe
А как тогда прятать не нужные мне в глобальной области видимости элементы?

Они и не будут в глобальной области, они будут свойствами соответствующего объекта.

Snipe 02.06.2008 13:24

Цитата:

Сообщение от Kolyaj (Сообщение 2750)
Они и не будут в глобальной области, они будут свойствами соответствующего объекта.

Это понятно, но я же их не использую вне объекта. Т.е. в принципе мне не надо NewObject.privateStr, даже наоборот, хочу сделать privateStr недоступным.

Kolyaj 02.06.2008 13:45

Цитата:

Сообщение от Snipe
хочу сделать privateStr недоступным.

А в результате страдает читабельность кода, скорость скрипта, количество используемой памяти. Оно надо?

Snipe 02.06.2008 14:00

Цитата:

Сообщение от Kolyaj (Сообщение 2752)
А в результате страдает читабельность кода, скорость скрипта, количество используемой памяти. Оно надо?

Конечно же необязательно. :)
Просто захотелось.

Кстати, а где тогда можно уточнить про влияние таких вот изворотов на скорость скрипта?

hogart 02.06.2008 15:48

Snipe, экспериментируйте:)

Но мысль на самом деле правильная. В большом проекте лучше скрывать ненужное. Инкапсуляция в ООП для этого и придумана.

Dmitry A. Soshnikov 02.06.2008 16:48

Snipe, посмотрите разницу для обоих случаев в:

alert(NewObject.constructor); // => NewObject.[[prototype]].constructor


Поэтому, если говорить об инициализирующем скопе, то первый вариант подойдет больше, т.к. во втором случае получается инстанс анонимной функции.

vasa_c 02.06.2008 17:47

Замыкания внутри конструкторов создают скорее не приватные свойства объектов, а приватные статические переменные "классов".И в этой ипостаси, они очень удобны. А городить всё это ради одного свойства, скорее всего, не стоит


Часовой пояс GMT +3, время: 22:34.