为什么这个扩展函数有效
Why does this extend function work?
我写了一个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
之后的其余代码将处理以下情况:
- 您尝试设置的中间属性是假的。您正在尝试设置路径
foo.bar.baz
但未定义foo.bar
,它会在设置foo.bar.baz
之前将{}
分配给foo.bar
。
中间属性 - 是真实的,在这种情况下,它将该中间属性设置为要处理的新目标。
这是错误的代码,因为如果中间属性不是Object
怎么办?例如,如果您有此对象,该怎么办:
{
foo: 1
}
你想设置foo.bar
.
extend(myObject, 'foo.bar', 'wombat')
它会尝试将foo.bar
设置为 'wombat'
,但foo
1
。你如何设置1.bar
?你不能。
相关文章:
- 为什么不是'我的函数在解析云代码中工作吗?当我在Angular和Express中测试时,它是有效的
- 外部链接的Javascript文件赢得't执行,但函数有效
- PHP函数的返回看起来如何对AJAX和PHP有效
- JavaScript函数在Safari中有效,但在Firefox中找不到
- 什么's是调用具有可变参数的函数的有效方法
- JavaScript,数组和函数 - 只有数组的最后一个元素有效
- 当将函数传递给方法时,为什么使用匿名函数容器而不仅仅是原始函数有效
- javascript onload函数有效,onresize则无效
- '$未定义'错误,但函数有效
- 为什么document.ready中的事件处理程序函数有效但无效;取出后不起作用
- 按钮单击Javascript函数失败,但函数有效
- 当我添加警报(“现在它可以工作”);这个函数有效,但我不想要这个
- 为什么这个扩展函数有效
- 包括来自外部文件的jQuery,有些函数有效,有些则无效
- JavaScript 匿名函数有效语法,防止全局范围污染
- Prestashop javascript加载函数有效,但其他函数无效
- onclick有两个功能.只有第一个函数有效
- 为什么这个记忆实现对匿名函数有效,而对声明函数无效?
- Processing.getInstanceById (id);对一个函数有效,对另一个函数未定义
- 为什么这个函数有效?不应该在每次调用函数时“执行”都返回 false