我试图创建一个小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”的深层魔法有关,但我无法弄清楚
我如何拦截我的类返回的代理对象的构造?
1条答案
按热度按时间ulydmbyx1#
construct
陷阱只有在代理本身上调用[[Construct]]
内部方法时才会被调用。这可能是由于使用了new
运算符。但是,在本例中,Proxy是在BoundObject
构造函数上调用new
的结果;new
未在代理本身上调用。下面是一个可以调用
construct
陷阱的示例。