2016-02-25 6 views
0

Я написал функцию javascript, чтобы расширить объект с помощью свойств, следующих за такими обозначениями: «a.b.c». Функция работает безупречно (до сих пор), но я не мог понять, оглядываясь на мой код, почему это сработало. Я предполагаю, что есть пояснение в javascript, возможно, цикл for? но мне было интересно, сможет ли кто-нибудь объяснить это мне должным образом.Почему эта функция расширяется?

var extend = (target, targetProperty, value) => { 
    var targetProperties = targetProperty.split("."); 

    for (var i = 0, len = targetProperties.length; i < len; i++) { 
    var part = targetProperties[i]; 

    if (i == len - 1) { 
     target[part] = value; 
     break; 
    } 

    if (!target[part]) { 
     target[part] = {}; 
    } 

    target = target[part]; 
    } 
} 

var myObject = {myProperty: "Hello"}; 

console.log(myObject); 

extend(myObject, "a.b.c", "World"); 

console.log(myObject); 

Это довольно прямо вперед, я понимаю, что «цель» приходит в качестве ссылки, потому что это объект, часть, которую я не понимаю, как на линии target = target[part]; исходный объект передается в не полностью перезаписывается вновь созданным пустым объектом в этой строке target[part] = {};.

Спасибо!

+0

Я думаю, вы имеете в виду 'target = target [part]' – kmiyashiro

ответ

0

Причина в том, что из-за break;, который выходит из цикла и не запускает код после него.

Остальная часть кода после break является обрабатывать случаи, когда:

  1. промежуточное свойство вы пытаетесь установить является falsey. то есть. Вы пытаетесь установить путь foo.bar.baz, но foo.bar не определено, оно назначит {} до foo.bar перед установкой foo.bar.baz.
  2. Промежуточное свойство является правдивым, и в этом случае оно устанавливает промежуточное свойство как новую цель для обработки.

Это плохой код, потому что, если промежуточное свойство не является Object? Например, что если у вас есть этот объект:

{ 
    foo: 1 
} 

И вы хотите установить foo.bar.

extend(myObject, 'foo.bar', 'wombat') 

Было бы попытаться установить foo.bar в 'wombat', но foo является 1. Как вы устанавливаете 1.bar? Вы не можете.

+0

Вы никогда не пробовали? '(1) .bar = 'wombat';' работает безупречно. – Bergi

+0

Работает так, как вы думаете, что делает? Или просто не бросает ошибку? – kmiyashiro

+0

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

0

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

Вы обновляете ссылку вместо изменения объекта.

+0

Если это так, то почему после выполнения функции myObject имеет все необходимые свойства? Как и исходное свойство перед запуском, функция все еще сохраняется. – Ross

+0

@Ross: функция изменяет свойства объекта. Он не перезаписывает ваш объект. – Bergi

+0

@ Берги: Я совсем юниор, но я также не думаю, что правильно задал вопрос. 'target' является ссылкой на' myObject' в этой функции. В конце функции я назначаю цель новым пустым объектом 'target = target [part];'. Я просто не уверен, почему myObject не стал тем пустым объектом и вместо этого остался в такте. Извиняюсь, если я просто не получаю его :) – Ross