需求: 在全局中只有一个namespace函数,
可以实现两种功能, 一种是存储数据,另一种是读取数据
存储数据的时候: namespace('a.b.c', 123);
读取数据的时候: namespace('a.b.c') => 123
读取: namespace('a.b') => {c: 123}
读取: namespace('a') => {b: {c: 123}}
a:{
b: {
c: 123
}
}
该函数可以实现两种功能:
第一种是可以存储数据: 当存储数据的时候需要接收两个参数,第一个参数是存储的路径,第二个参数存储的数据
第二种是可以读取数据: 当读取数据的时候,需要接收一个参数就是要读取的路径
var namespace = (function() {
// 数据存储和读取的对象
var obj = {};
return function(path, val) {
// 模拟函数的重载
if(arguments.length == 2) { //实参个数为2 则为存储数据
// 划分路径
var pathArr = path.split('.');
// 引用obj变量
var obj1 = obj;
// 设置最后的键
var index = pathArr.pop();
// 循环产生对象
for(var i = 0;i < pathArr.length; i++) {
var value = pathArr[i];
// 判断
if(obj1[value] === undefined) {
// 生成一个对象
obj1[value] = {};
// 将obj1指向新生成的对象
obj1 = obj1[value];
}else if(typeof obj1[value] === 'object' && obj1[value] !== null) {
// 将obj1指向新生成的对象
obj1 = obj1[value];
}else {
// obj1有值,但不是一个对象
console.log('已经有值');
return;
}
}
// 进行赋值操作
obj1[index] = val;
console.log(obj);
}else if(arguments.length == 1) { // 实参个数为1 则为读取数据
// 划分路径
var pathArr = path.split('.');
// 引用obj变量
var obj1 = obj;
// 设置最后的键
var index = pathArr.pop();
// 循环读取对象
for(var i = 0; i < pathArr.length; i++) {
var value = pathArr[i];
obj1 = obj1[value];
if(!(typeof obj1 === 'object' && obj1 !== null)) {
console.log('读取路径不对');
return;
}
}
// 返回对象的值
return obj1[index];
}
}
})();
namespace('a.b.c', 111);
console.log(namespace('a.b.c'));
来源:https://www.cnblogs.com/yess/p/12161760.html