//--------------转换函数,不用管---------------
function stringifyFunction(obj: any) {
let newobj = JSON.parse(JSON.stringify(obj))
for (let key in obj) {
if (obj[key] instanceof Function) {
newobj[key] = obj[key].toString().replace(/[\n\t]/g, "");
continue;
}
if (obj[key] instanceof Object) {
newobj[key] = stringifyFunction(obj[key]);
}
}
return newobj;
}
function objectToString(obj: any) { // 用于替代JSON.stringify函数
let _object = stringifyFunction(obj);
return JSON.stringify(_object)
}
function stringToFunction(obj: any) { // 将对象中的函数字符串转化为函数
var regex = /^((function\s)|.)([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)\s\{.*\}/ //匹配函数字符串
for (let key in obj) {
if (obj[key] instanceof Object) {
stringToFunction(obj[key]);
} else {
if (regex.test(obj[key])) { // 是一个函数
try {
let params = obj[key].substring(obj[key].indexOf('(') + 1, obj[key].indexOf(')'));
let operation = obj[key].substring(obj[key].indexOf("{") + 1, obj[key].length - 1);
obj[key] = new Function(params, operation);
} catch (e) {
console.log(e)
}
}
}
}
return obj
}
function stringToObject(string: any) { // 用于替代JSON.parse
let obj = JSON.parse(string); //将字符串转为对象
return stringToFunction(obj) // 将对象中的函数字符串转为函数
}
//--------------转换函数,不用管 end---------------
//实际项目中 funcTest 是放在单独一个 .ts 中
function funcTest() {
function func1(a: any) {
console.log("我是func1", a);
func2();
}
function func2() {
console.log("我是func2");
}
return {
func1,
func2
}
}
//------------------- 分割线--------------
const { func1, func2 } = funcTest();
var obj = {
func: (a: any) => {
console.log(a);
func1(a);
}
}
//obj.func("参数2"); //=>正常打印 '我是func1','我是func2'
const str = objectToString(obj);//对象转字符串
var newObj = stringToObject(str);//字符串转回
newObj.func("参数1");//打印参数1后报错,该如何解决?
//如果传参 可以解决,但是实际项目 func 不能给其他参数。属于基于ts的内置函数
//newObj.func("参数1", funcTest()); //虽然能解决,但是实际项目不能运用。
问题:
我有一个obj 对象,里面有个 func 的函数属性,调用了 funcTest() 里的 func1()方法
在经过字符串转换后,引用会丢失,造成 调用 func1() 时会报错。
如果调用时 传 funcTest() 可以解决这个问题,但是我的实际项目中, func() 不可以再传额外的参数了。