qxVm/qxVm_sanbox/env/TOOLS/vm_proxy.js
Iceland-monsoon 679f61fa08 更新
2023-07-26 15:34:01 +08:00

242 lines
10 KiB
JavaScript

// ========================================================================================================================
lwVm.proxy = function (obj, objname, type) {
function get_attribute_type(value) {
return Object.prototype.toString.call(value);
}
function get_method_handler(watchName) {
return {
apply(target, thisArg, argArray) {
let result = Reflect.apply(target, thisArg, argArray);
if (thisArg === console && target.name === "log") {
return result;
};
if (target.name === "toString") {
return result;
};
if (lwVm.config.logOpen === true) {
console.log(`[${watchName}] apply function name is [${target.name}], argArray is [${argArray}], result is [${result}].`);
}
return result
},
construct(target, argArray, newTarget) {
let result = Reflect.construct(target, argArray, newTarget);
if (lwVm.config.logOpen === true) {
console.log(`[${watchName}] construct function name is [${target.name}], argArray is [${argArray}], result is [${(result)}].`);
}
return result;
}
}
}
function get_obj_handler(WatchName) {
return {
get(target, propKey, receiver) {
if (lwVm.config.proxy_proto === false && propKey === "__proto__") {
console.log(`getting propKey-> ${WatchName}.${propKey} value-> ${(target[propKey])}`)
return target[propKey]
};
let result = Reflect.get(target, propKey, receiver);
let result_type = get_attribute_type(result);
if (result instanceof Object) {
if (Object.getOwnPropertyDescriptor(target, propKey)?.writable === false) {
console.log(`getting propKey-> ${WatchName}.${propKey} it is non-writable`)
} else {
if (typeof result === "function") {
if (lwVm.config.logOpen === true) {
console.log(`getting propKey-> ${WatchName}.${propKey} value-> ${lwVm.compress_jsCode(String(result))} typeof-> ${result_type}`);
}
return new Proxy(result, get_method_handler(WatchName))
} else {
if (lwVm.config.logOpen === true) {
console.log(`\ngetting propKey-> ${WatchName}.${propKey} value-> ${lwVm.compress_jsCode(String(result))} typeof-> ${result_type}`);
}
}
return new Proxy(result, get_obj_handler(`${WatchName}.${propKey}`))
}
}
if (typeof (propKey) !== "symbol" && propKey !== "toString") {
try {
if (lwVm.config.logOpen === true) {
console.log(`\ngetting propKey-> ${WatchName}.${propKey?.description ?? propKey} result-> ${result} typeof-> ${result_type}`);
}
} catch (e) {
console.log(`[${WatchName}] getting error`);
}
}
return result;
},
set(target, propKey, value, receiver) {
let value_type = get_attribute_type(value);
if (value instanceof Object) {
if (lwVm.config.logOpen === true) {
console.log(`\nsetting propKey-> ${WatchName}.${propKey} value-> ${lwVm.compress_jsCode(String(value))} typeof-> ${value_type}`);
}
} else {
if (lwVm.config.logOpen === true) {
console.log(`\nsetting propKey-> ${WatchName}.${propKey} value-> ${lwVm.compress_jsCode(String(value))} typeof-> ${value_type}`);
}
}
return Reflect.set(target, propKey, value, receiver);
},
has(target, propKey) {
let result = Reflect.has(target, propKey);
if (lwVm.config.logOpen === true) {
console.log(`has propKey-> ${WatchName}.${propKey}, result-> ${result}`);
}
return result;
},
deleteProperty(target, propKey) {
let result = Reflect.deleteProperty(target, propKey);
if (lwVm.config.logOpen === true) {
console.log(`delete propKey-> ${WatchName}.${propKey}, result-> ${result}`);
}
return result;
},
getOwnPropertyDescriptor(target, propKey) {
let result = Reflect.getOwnPropertyDescriptor(target, propKey);
if (lwVm.config.logOpen === true) {
try {
console.log(`getOwnPropertyDescriptor propKey-> ${WatchName}.${propKey} result-> ${(String(result))}`);
} catch (error) { }
}
return result;
},
defineProperty(target, propKey, attributes) {
let result = Reflect.defineProperty(target, propKey, attributes);
try {
if (lwVm.config.logOpen === true) {
console.log(`defineProperty propKey-> ${WatchName}.${propKey} attributes is [${(attributes)}], result is [${result}]`);
}
} catch (e) {
console.log(`[${WatchName}] defineProperty error`)
}
return result;
},
getPrototypeOf(target) {
let result = Reflect.getPrototypeOf(target);
if (lwVm.config.logOpen === true) {
console.log(`[${WatchName}] getPrototypeOf result is [${(result)}]`);
}
return result;
},
setPrototypeOf(target, proto) {
let result = Reflect.setPrototypeOf(target, proto);
if (lwVm.config.logOpen === true) {
console.log(`[${WatchName}] setPrototypeOf proto is [${(proto)}], result is [${result}]`);
}
return result;
},
preventExtensions(target) {
let result = Reflect.preventExtensions(target);
if (lwVm.config.logOpen === true) {
console.log(`[${WatchName}] preventExtensions, result is [${result}]`);
}
return result;
},
isExtensible(target) {
let result = Reflect.isExtensible(target);
if (lwVm.config.logOpen === true) {
console.log(`[${WatchName}] isExtensible, result is [${result}]`);
}
return result;
},
ownKeys(target) {
let result = Reflect.ownKeys(target);
if (lwVm.config.logOpen === true) {
try {
console.log(`[${WatchName}] invoke ownkeys, result is [${String((result))}]`);
} catch (error) {
}
}
return result
}
}
}
if (lwVm.config.proxy === false) {
return obj
}
// if (type === "method") {
if (typeof obj === "function") {
return new Proxy(obj, get_method_handler(objname));
}
return new Proxy(obj, get_obj_handler(objname));
};
lwVm.proxy_chained = function (obj_, obj_name) {
function set_traverse_object(tarrget, obj, recursion_layers) {
recursion_layers -= 1;
for (let prop in obj) {
const value = obj[prop];
const tg_name = `${tarrget}.${prop.toString()}`;
const value_type = get_value_type(value);
if (value && value_type === "object" && recursion_layers >= 1) {
set_traverse_object(tg_name, value, recursion_layers);
continue
}
if (value && value.toString() !== '[object Object]') {
if (lwVm.config.logOpen === true) lwVm.console_log(`setter hook->${tg_name}; value-> ${value}; typeof-> ${value_type}`);
continue
}
if (lwVm.config.logOpen === true) lwVm.console_log(`setter hook->${tg_name}; value-> ${value}; typeof-> ${value_type}`)
}
}
function new_handel(target_name, obj, number) {
return new Proxy(obj, my_handler(target_name, number))
}
function get_value_type(value) {
if (Array.isArray(value)) {
return 'Array'
}
return typeof value;
}
function my_handler(target_name, number) {
return {
set: function (obj, prop, value) {
const value_type = get_value_type(value);
const tg_name = `${target_name}.${prop.toString()}`;
if (value && value_type === "object") {
set_traverse_object(tg_name, value, number)
} else {
if (lwVm.config.logOpen === true) lwVm.console_log(`setter hook->${tg_name}; value-> ${value}; typeof-> ${value_type}`)
}
return Reflect.set(obj, prop, value);
},
get: function (obj, prop) {
const tg_name = `${target_name}.${prop.toString()}`;
const value = Reflect.get(obj, prop);
let value_type = get_value_type(value);
if (value && value_type === 'object') {
return new_handel(tg_name, value, number)
}
if (lwVm.config.logOpen === true) lwVm.console_log(`getter hook->${tg_name}; value-> ${value}; typeof-> ${value_type}`);
return value
},
deleteProperty(target, propKey) {
// 没有实现链式输出
let result = Reflect.deleteProperty(target, propKey);
let value_type = get_value_type(result);
if (lwVm.config.logOpen === true) lwVm.console_log(`delete hook-> ${propKey}, result-> ${result}; typeof-> ${value_type}`);
return result;
}
}
}
return new Proxy(obj_, my_handler(obj_name, 30));
}