先看函数代码
js
const use = (name) => {
const parts = name.split(".");
let obj = use;
for (const part of parts) {
if (!obj[part]) {
obj[part] = {};
}
obj = obj[part];
}
return obj;
};
函数效果
这是一个用于在全局作用域中创建和访问对象的函数。它允许你通过一个字符串路径来访问或创建对象的属性。
如果你调用 use('a.b.c')
,就会创建这样的结构:
js
use = {
... // other properties
a: {
b: {
c: {}
}
}
}
如果你再调用 use('x.y.z')
,就会创建这样的结构:
js
use = {
... // other properties
a: {
b: {
c: {}
}
},
x: {
y: {
z: {}
}
}
}
从而创建一个拥有指定属性的全局对象,属性一旦创建,不会被覆盖和删除。
Q && A
- 为什么要用
let obj = use;
而不用let obj = {};
?
答:为了状态持久化,如果使用 let obj = {};
,就说明每次调用 use
函数,都会创建一个新对象,不能提供一个全局对象;
- 为什么要执行
obj = obj[part];
?
答:为了移动指针到下一层对象,从而创建嵌套式的结构;
总结
整段代码可以类比创建文件系统:
if (!obj[part])
是判断该文件夹是否存在,如果不存在就创建文件夹,即obj[part] = {};
obj = obj[part];
就是调用cd
进入刚刚创建(或者是已存在)的文件夹中;- 最后返回的
obj
,就是返回最深层的文件夹指针;
这种模式通常用于:
- 创建命名空间
- 构建模块系统
- 实现插件系统
- 管理配置对象