JavaScript中代理或者拦截器
2020-03-27 本文已影响0人
orgcheng
需求是通过变量patched来监听wrapper数组是内容是否被修改,NodeJS是使用defineProperty、ObjectDefineProperty和ReflectSet等对象来实现的,这里使用object.defineProperty、Reflect和Proxy等来替换。
"use strict";
function Module() {
}
let patched = false;
let wrap = function (script) {
return Module.wrapper[0] + script + Module.wrapper[1];
};
const wrapper = [
"(function (exports, require, module, __filename, __dirname) { ",
"\n});"
];
// 定义wrapper的代理,类似java中的代理,代理类修改了set和defineProperty的逻辑
let wrapperProxy = new Proxy(wrapper, {
set(target, property, value, receiver) {
patched = true;
return Reflect.set(target, property, value, receiver);
},
defineProperty(target, property, descriptor) {
patched = true;
return Object.defineProperty(target, property, descriptor);
}
});
// 给Module定义wrap属性
Object.defineProperty(Module, "wrap", {
get() {
return wrap;
},
set(value) {
patched = true;
wrap = value;
}
});
Object.defineProperty(Module, "wrapper", {
get() {
return wrapperProxy;
},
set(value) {
patched = true;
wrapperProxy = value;
}
});
console.log(Module.wrapper[0]);
// (function (exports, require, module, __filename, __dirname) {
console.log(Module.wrapper[1]);
//
// });
console.log(wrapperProxy);
// [
// '(function (exports, require, module, __filename, __dirname) { ',
// '\n});'
// ]
console.log(wrap === Module.wrap);
// true