我编写了一个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] = {};
。
谢谢!
答案 0 :(得分:0)
原因是因为break;
,它突破了循环并且不会在它之后运行代码。
break
之后的其余代码用于处理以下情况:
foo.bar.baz
,但foo.bar
未定义,在设置{}
之前会将foo.bar
分配给foo.bar.baz
。这是错误的代码,因为如果中间属性不是Object
怎么办?例如,如果你有这个对象怎么办:
{
foo: 1
}
您想设置foo.bar
。
extend(myObject, 'foo.bar', 'wombat')
它会尝试将foo.bar
设置为'wombat'
,但foo
为1
。你如何设置1.bar
?你不能。
答案 1 :(得分:0)
target
仅存在于函数范围内,因此更改target
变量的值只会在函数范围内更改它。
您正在更新参考而不是更改对象。