我想测试一个 JavaScript 对象是否是一个Proxy。琐碎的方法
if (obj instanceof Proxy) ...
在这里不起作用,也不能遍历 的原型链Proxy.prototype
,因为所有相关操作都得到了底层目标的有效支持。
是否可以测试任意对象是否是代理?
我想测试一个 JavaScript 对象是否是一个Proxy。琐碎的方法
if (obj instanceof Proxy) ...
在这里不起作用,也不能遍历 的原型链Proxy.prototype
,因为所有相关操作都得到了底层目标的有效支持。
是否可以测试任意对象是否是代理?
在我当前的项目中,我还需要一种定义某物是否已经是代理的方法,主要是因为我不想在代理上启动代理。为此,我只是在我的处理程序中添加了一个 getter,如果请求的变量是“__Proxy”,它将返回 true:
function _observe(obj) {
if (obj.__isProxy === undefined) {
var ret = new Proxy(obj || {}, {
set: (target, key, value) => {
/// act on the change
return true;
},
get: (target, key) => {
if (key !== "__isProxy") {
return target[key];
}
return true;
}
});
return ret;
}
return obj;
}
可能不是最好的解决方案,但我认为这是一个优雅的解决方案,在序列化时也不会弹出。
在 Node.js 10 中,您可以使用util.types.isProxy
.
例如:
const target = {};
const proxy = new Proxy(target, {});
util.types.isProxy(target); // Returns false
util.types.isProxy(proxy); // Returns true
创建一个新符号:
let isProxy = Symbol("isProxy")
在get
您的代理处理程序的方法中,您可以检查 是否key
是您的符号,然后return true
:
get(target, key)
{
if (key === isProxy)
return true;
// normal get handler code here
}
然后,您可以使用以下代码检查对象是否是您的代理之一:
if (myObject[isProxy]) ...
来自http://www.2ality.com/2014/12/es6-proxies.html:
无法确定一个对象是否是代理(透明虚拟化)。
instanceof Proxy
:我不推荐它,但是如果您想添加对 的支持instanceof
,您可以在实例化任何代理之前执行以下操作:
(() => {
var proxyInstances = new WeakSet()
// Optionally save the original in global scope:
originalProxy = Proxy
Proxy = new Proxy(Proxy, {
construct(target, args) {
var newProxy = new originalProxy(...args)
proxyInstances.add(newProxy)
return newProxy
},
get(obj, prop) {
if (prop == Symbol.hasInstance) {
return (instance) => {
return proxyInstances.has(instance)
}
}
return Reflect.get(...arguments)
}
})
})()
// Demo:
var a = new Proxy({}, {})
console.log(a instanceof Proxy) // true
delete a
var a = new originalProxy({}, {})
console.log(a instanceof Proxy) // false
delete a