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

上一篇 下一篇

猜你喜欢

热点阅读