为什么扩展功能有效?

时间:2016-02-25 19:33:55

标签: javascript

我编写了一个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);

这是非常直接的,我明白&#34;目标&#34;由于它是一个对象而引用,我不明白的部分是如何在行target = target[part];上传入的原始对象没有被这行上新创建的空对象完全覆盖target[part] = {};

谢谢!

2 个答案:

答案 0 :(得分:0)

原因是因为break;,它突破了循环并且不会在它之后运行代码。

break之后的其余代码用于处理以下情况:

  1. 您尝试设置的中间属性为falsey。即。您正尝试设置路径foo.bar.baz,但foo.bar未定义,在设置{}之前会将foo.bar分配给foo.bar.baz
  2. 中间属性是真实的,在这种情况下,它将中间属性设置为要处理的新目标。
  3. 这是错误的代码,因为如果中间属性不是Object怎么办?例如,如果你有这个对象怎么办:

    {
      foo: 1
    }
    

    您想设置foo.bar

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

    它会尝试将foo.bar设置为'wombat',但foo1。你如何设置1.bar?你不能。

答案 1 :(得分:0)

target仅存在于函数范围内,因此更改target变量的值只会在函数范围内更改它。

您正在更新参考而不是更改对象。