【问题标题】:Invocation of get method instead of set in Proxy object调用 get 方法而不是在 Proxy 对象中设置
【发布时间】:2020-11-26 16:41:15
【问题描述】:

编码员!我开始研究 JavaScript 代理对象并遇到了一些奇怪的行为。 我正在尝试将一个数字推送到代理数组,但是,出乎意料的是,get 方法被调用了,如果它存在!但是,如果我删除arrayHandler 中的get 方法,set 会按预期调用,并推送数字。为什么会这样?

class SomeClass {
    public readonly name: String;
    public originalData: Array<number> = [];

    private arrayHandler = {
        set(
            target: Array<number>,
            prop: number,
            val: any,
            reciever: any
        ): boolean {
            console.log("PROXY HANDLER SET");
            target[prop] = val;
            return true;
        },
        get(target: Array<number>, prop: number): void {
            console.log("PROXY HANDLER GET");
        },
    };
    public proxyToArray: any = new Proxy(this.originalData, this.arrayHandler);

    constructor(name: String) {
        this.name = name;
    }
}

let item = new SomeClass("item-1");
item.proxyToArray.push(1);

【问题讨论】:

    标签: javascript typescript proxy


    【解决方案1】:

    你需要在getter中返回目标:

    class SomeClass {
        public readonly name: String;
        public originalData: Array<number> = [];
    
        private arrayHandler = {
            set(
                target: Array<number>,
                prop: number,
                val: any,
                reciever: any
            ): boolean {
                console.log("PROXY HANDLER SET");
                target[prop] = val;
                return true;
            },
            get(target: Array<number>, prop: number): any {
                console.log("PROXY HANDLER GET");
                return target[prop];
            },
        };
        public proxyToArray: any = new Proxy(this.originalData, this.arrayHandler);
    
        constructor(name: String) {
            this.name = name;
        }
    }
    
    let item = new SomeClass("item-1");
    item.proxyToArray.push(1);
    

    【讨论】:

    • 无论如何,当我调用 push() 时,为什么在代理对象上调用方法 GET 和 SET?这对我来说并不明显,因为我只期望 SET 方法;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多