JavaScript构造陷阱在返回代理的类中不起作用

kulphzqa  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(114)

我试图创建一个小javascript的双向形式绑定器使用代理。我被困在如何拦截“新”电话上。我用了一个“构造”陷阱,但它不火。这是我的代码,我已经删除了不依赖于我的具体问题的东西

class BoundObject {

        constructor(object, element) {

            // distribute object properties into "this"
            for (const prop in object) {
                this[prop] = object[prop]
            }

            return new Proxy(this, {

                construct:(target, args) => {
                    console.log(`Creating a new ${target.name}`) // why is this not fired?
                    return Reflect.construct(...args)
                },
                set: (target, prop, val, receiver) => {
                    console.log(`attempting to set ${prop}=${val} type ${typeof val}`);

                    return Reflect.set(target, prop, val) 
                }
            })
        }
    }

    // create an instance of our BoundObject class, passing in an object and an HTML element
    const user = new BoundObject({name:'fred'},document.querySelector('#user-form'))    // why is the 'construct' call not intercepted?
    user.name = 'mary' // set user name. The 'set' call is sucessfully intercepted

set陷阱工作正常,但construct陷阱无法触发。我怀疑这与JavaScript对“this”的深层魔法有关,但我无法弄清楚
我如何拦截我的类返回的代理对象的构造?

ulydmbyx

ulydmbyx1#

construct陷阱只有在代理本身上调用[[Construct]]内部方法时才会被调用。这可能是由于使用了new运算符。但是,在本例中,Proxy是在BoundObject构造函数上调用new的结果; new未在代理本身上调用。
下面是一个可以调用construct陷阱的示例。

function MyObj() {}
const proxy = new Proxy(MyObj, {
  construct(target, args) {
    console.log(args);
    return new target(...args);
  }
});
new proxy('something');

相关问题