【发布时间】:2017-09-14 20:27:43
【问题描述】:
我在使用 Proxy 类时遇到了这个有趣的错误:
TypeError: 'set' on proxy: trap returned truish for property 'users' which exists in the proxy target as a non-configurable and non-writable data property with a different value
我有一个递归创建代理对象属性的库,其中任何非原始属性都是代理对象本身,等等:
let mcProxy = function (target) {
const mirrorCache = {};
return new Proxy(target, {
set: function (target, property, value, receiver) {
if (mirrorCache[property]) {
throw new Error(`property ${property} has already been set`);
}
mirrorCache[property] = true;
Object.defineProperty(target, property, {
writable: false,
value: (value && typeof value === 'object') ? mcProxy(value) : value
});
return true;
}
});
};
exports.create = function (val) {
val && assert.equal(typeof val, 'object', 'val must be an object');
return mcProxy(val || {});
};
上述库代码的实际用法:
//bash
$ npm install proxy-mcproxy
// nodejs
let McProxy = require('proxy-mcproxy');
let val = McProxy.create();
val.users = [];
val.users = 3; // kaaaboom..error!
但是当我第一次设置 users 属性时,我得到了这个问题的标题错误!
在我上面的库代码中,mirrorCache 是一种检查属性是否先前已设置的方法。我想要做的是抛出一个错误,即使我们不在strict 模式下,所以mirrorCache 似乎是必要的,所以我自己记账。
也许有不同或更好的方法来实现我想要实现的目标?这是我的目标:
- 抛出错误即使不是在严格模式下。
- 只要开发人员重新分配属性,就会引发错误。每个分配的属性都应该是不可变的。
【问题讨论】:
-
proxy-mcproxy 是一个很酷的小库,当我让它工作时:)
标签: javascript node.js proxy