为什么这个扩展函数有效

Why does this extend function work?

本文关键字:函数 有效 扩展 为什么      更新时间:2023-09-26

我写了一个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] = {};上新创建的空对象覆盖。

谢谢!

target只存在于函数的作用域中,因此更改target变量的值只会在函数作用域内更改它。

您正在更新引用,而不是更改对象。

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

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

  1. 您尝试设置的中间属性是假的。您正在尝试设置路径foo.bar.baz但未定义foo.bar,它会在设置foo.bar.baz之前将{}分配给foo.bar
  2. 中间属性
  3. 是真实的,在这种情况下,它将该中间属性设置为要处理的新目标。

这是错误的代码,因为如果中间属性不是Object怎么办?例如,如果您有此对象,该怎么办:

{
  foo: 1
}

你想设置foo.bar.

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

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