需求: 在全局中只有一个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
时间: 2024-10-09 21:31:32