Как установить конкретное свойство для частного объекта - PullRequest
4 голосов
/ 07 декабря 2011

Я хочу иметь возможность установить свойство для частного объекта, указав нотационный путь к значению. Сложность в том, что этот объект находится в закрытии, поэтому я не могу получить к нему прямой доступ, чтобы установить значение обычным способом (например, dot.notation.path = 'new value'). Это кажется странным, но я не могу придумать очевидного пути.

Пример:

// setter function   
function set(path, change){
    var privateObject = {
      a: 'a',
      b: 'b',
      c: {
          d: 'd',
          e: 'e'
      }
    }

    privateObject[path] = change;
    return privateObject;
}

// execution
var result = set('c.d', 'new value'); 

// desired result
//{
//  a: "a"
//  b: "b"
//  c: {
//    d: "new value",
//    e: 'e'
//  }
//}

// actual result
//{
//  a: "a"
//  b: "b"
//  c: {
//    d: 'd',
//    e: 'e'
//  }
//  c.d: "new value"
//}

Рабочий пример:

Пример JSFiddle с ошибкой >>

[Обновить] Альтернативный пример:

Пример работы с JSFiddle >>

Ответы [ 2 ]

5 голосов
/ 08 декабря 2011

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

function set(path, change){
  var privateObject = {
        a: 'a',
        b: 'b',
        c: {
            d: 'd',
            e: 'e'
        }
      },
      index,
      parts,
      obj;

  parts = path.split(".");
  obj = privateObject;
  if (parts.length) {
    index = 0;
    while (index < parts.length - 1) {
      obj = obj[parts[index++]];
    }
    obj[parts[index]] = change;
  }
  return privateObject;
}

Живая демоверсия

Я остановил это, это не гиперэффективно на старых двигателях, и я не удосужилсяИзучите режимы сбоев, но у вас есть идея: разделите путь, который вы указываете на точку, а затем используйте каждую компонентную часть страницы.

2 голосов
/ 07 декабря 2011

Это не имеет ничего общего с частными объектами или замыканиями, и во многом связано с тем, что

someObject['c.d']

не эквивалентно

someObject['c']['d']

или

someObject.c.d

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

Однако все упражнение кажется бессмысленным. Если вы выполняете произвольные изменения для закрытого объекта вне его области, почему бы просто не добавить механизм для получения закрытого объекта и изменить его напрямую?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...