Как добавить частную переменную к этому отрывку литерала объектов JavaScript?

Для получения и верхнего регистра и нижнего регистра объединяют два диапазона:

$alphas = array_merge(range('A', 'Z'), range('a', 'z'));
15
задан the_drow 30 September 2010 в 22:22
поделиться

3 ответа

У вас не может быть "частных" переменных без задействованной функции. Функции - это единственный способ ввести новую область видимости в javascript.

Но не бойтесь, вы можете добавлять функции в нужное место, чтобы получить такую ​​функциональность с вашим объектом

var dataset = {
  tables: {
    customers:(function(){
      var privateVar = 'foo';
      return { 
        cols:[ /*here*/ ],
        rows:[ /*here*/ ]
      }
    }()),
    orders:{
      cols:[ /*here*/ ],
      rows:[ /*here*/ ]
    }
  },
  relations: [{
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid',
    onetomany:true
  }]
};

Но это не « Мы многого добьемся. Это все еще в основном набор буквальных объектов. Эти типы «частных» переменных не имеют смысла, поскольку отсутствуют методы - ничего, что могло бы фактически читать или иным образом использовать переменные в области видимости, которую мы создали путем добавления функции (замыкание).

Но если бы у нас был метод, это может действительно стать полезным.

var dataset = {
  tables: {
    customers:(function(){
      var privateVar = 'foo';
      return { 
        cols:[ /*here*/ ],
        rows:[ /*here*/ ],
        getPrivateVar: function()
        {
          return privateVar;
        }
      };
    }()),
    orders:{
      cols:[ /*here*/ ],
      rows:[ /*here*/ ]
    }
  },
  relations: [{
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid',
    onetomany:true
  }]
};

alert( dataset.tables.customers.getPrivateVar() );
26
ответ дан 1 December 2019 в 00:59
поделиться

Частные переменные в javascript выполняются с использованием ключевого слова var внутри замыкания. Доступ к нему имеют только привилегированные методы и атрибуты. Вот способ сделать это:

function dataset()
{
var private_stuff = 10; // private
this.foo = new function() { alert(private_stuff); } // priviliged
return {
    tables:{
        customers:{
                cols:[  ],
                rows:[  ]
        },
        orders:{
                cols:[  ],
                rows:[  ]
        }
    },
    relations:{
        0:{
                parent:'customers', 
                child:'orders', 
                keyparent:'custid', 
                keychild:'orderid',
                onetomany:true
        }
    }
}; // public
}

var d = new dataset;
alert(d.foo());
4
ответ дан 1 December 2019 в 00:59
поделиться

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

Это скорее зависит от того, что вы хотите делать с объектом - обычный метод для «частных» членов означает, что они доступны только для функций-членов, и требует, чтобы вы использовали конструктор для создания объекта. Синтаксис литерала используется для структур данных или легких объектов с общедоступными данными и функциями.

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

dataset = {
    secretCounter: ( 
      function () {
      var c = 0;
      return function () { return ++c; }
    })(),      
   ...

Итак, dataset.secretCounter () имеет переменную c , которая является закрытой для только эта функция.

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

dataset = {
    secretCounter: ( 
      function () {
      var c = 0;
      return function () { return ++c; }
    })(),      
   ...

Итак, dataset.secretCounter () имеет переменную c , которая является закрытой для только эта функция.

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

dataset = {
    secretCounter: ( 
      function () {
      var c = 0;
      return function () { return ++c; }
    })(),      
   ...

Итак, dataset.secretCounter () имеет переменную c , которая является закрытой для только эта функция.

10
ответ дан 1 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

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