在 ES6 中,我们已经可以使用 Proxy 对象来拦截对目标对象的访问、赋值、删除等操作。而在 ES7 中,Proxy 对象又新增了一些特性,例如可以通过 apply
方法拦截对函数的调用。但是,在使用 Proxy 代理对象时,我们有时候会遇到 TypeError
的问题,本文将探讨如何解决这个问题。
问题描述
在使用 Proxy 对象时,有时候会遇到以下的 TypeError
错误:
TypeError: 'set' on proxy: trap returned falsish for property 'xxx'
这个错误表示我们在拦截某个属性的 set
操作时,返回了一个 falsy 值,导致操作被拒绝。这个错误通常发生在我们使用 Reflect
对象进行属性操作时,例如:
const proxy = new Proxy({}, { set(target, key, value, receiver) { return Reflect.set(target, key, value, receiver); } }); proxy.xxx = 123;
在上面的代码中,我们使用 Reflect.set
方法来进行属性的赋值操作。但是,如果这个操作被拦截器函数返回了 falsy 值,就会导致 TypeError
错误。这是因为,在 Proxy 对象中,所有的操作都必须要有一个返回值,否则就会被视为操作失败。
解决方案
为了解决上述问题,我们需要在拦截器函数中返回一个 truthy 值,以表示操作成功。如果我们希望继续使用 Reflect
对象进行属性操作,可以使用如下的代码:
const proxy = new Proxy({}, { set(target, key, value, receiver) { const result = Reflect.set(target, key, value, receiver); return result === false ? false : true; } }); proxy.xxx = 123;
在上面的代码中,我们首先使用 Reflect.set
方法进行属性的赋值操作,然后判断返回值是否为 false
,如果是,则返回 false
,否则返回 true
。这样,就可以避免 TypeError
错误的发生了。
另外,如果我们需要拦截其他的属性操作,也需要在拦截器函数中返回一个 truthy 值。例如,如果我们要拦截 deleteProperty
操作,可以使用如下的代码:
const proxy = new Proxy({}, { deleteProperty(target, key) { const result = Reflect.deleteProperty(target, key); return result === false ? false : true; } }); delete proxy.xxx;
在上面的代码中,我们使用 Reflect.deleteProperty
方法进行属性的删除操作,并根据返回值判断操作是否成功。
总结
在 ES7 中,我们可以使用 Proxy 对象来拦截目标对象的访问、赋值、删除等操作。但是,在使用 Proxy 代理对象时,我们有时候会遇到 TypeError
的问题,这是因为所有的操作都必须要有一个返回值。为了解决这个问题,我们需要在拦截器函数中返回一个 truthy 值,以表示操作成功。同时,如果我们使用 Reflect
对象进行属性操作,也需要根据返回值判断操作是否成功。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6506222195b1f8cacd231ad8