Javascript Node.js:为具有代理的对象创建看门狗
编辑:它是一个对象代理,也可以看到答案,但是我不理解为什么console.log(看门狗)会产生这么多http和路径相关的东西,不理解它们之间的关联Javascript Node.js:为具有代理的对象创建看门狗,javascript,node.js,object,proxy,Javascript,Node.js,Object,Proxy,编辑:它是一个对象代理,也可以看到答案,但是我不理解为什么console.log(看门狗)会产生这么多http和路径相关的东西,不理解它们之间的关联 我想关注对象的变化,但是代理对象似乎是代理服务器对象 我是如何测试该功能的: var myObject = {}, watchDog = new Proxy( myObject, { set: function (target, key, value)
我想关注对象的变化,但是代理对象似乎是代理服务器对象 我是如何测试该功能的:
var myObject = {},
watchDog = new Proxy( myObject, {
set: function (target, key, value)
{
console.log(key, 'changed to ', value );
target[key] = value;
}
});
myObject.test = 1;
它永远不会被触发,因为它似乎不是对象代理。当我转储代理对象的内容(console.log(watchDog);
)时,它会显示大量内容,如下所示:
.............
.............
.............
{ http_parser: '2.8.0',
node: '8.11.3',
v8: '6.2.414.54',
uv: '1.19.1',
zlib: '1.2.11',
ares: '1.10.1-DEV',
modules: '57',
nghttp2: '1.32.0',
napi: '3',
openssl: '1.0.2o',
icu: '60.1',
unicode: '10.0',
cldr: '32.0',
tz: '2017c' },
arch: 'ia32',
platform: 'win32',
release:
{ name: 'node',
lts: 'Carbon',
sourceUrl: 'https://nodejs.org/download/release/v8.11.3/node-v8.11.3.tar
gz',
headersUrl: 'https://nodejs.org/download/release/v8.11.3/node-v8.11.3-he
ders.tar.gz',
libUrl: 'https://nodejs.org/download/release/v8.11.3/win-x86/node.lib' }
argv:
[ 'F:\\Program Files (x86)\\nodejs\\node.exe',
'L:\\Utils\\codebeat\\SerialInputDevice\\server\\app.js' ],
execArgv: [],
env:
{ ALLUSERSPROFILE: 'C:\\ProgramData',
APPDATA: 'C:\\Users\\User\\AppData\\Roaming',
CLASSPATH: '.;C:\\Program Files (x86)\\Java\\jre7_32\\lib\\ext\\QTJava.z
p',
CommonProgramFiles: 'C:\\Program Files (x86)\\Common Files',
'CommonProgramFiles(x86)': 'C:\\Program Files (x86)\\Common Files',
CommonProgramW6432: 'C:\\Program Files\\Common Files',
..............
..............
etc.
所以这不是一个对象代理。如何创建对象代理而不是代理服务器对象 另见
watchDog.test = 5
它确实产生产出。原始的myObject
不会被修改,而是在其周围创建了一个“shell”,可用于在允许与原始对象交互之前拦截交互
在Chrome中(我刚刚尝试过),这个输出测试更改为5
。但是,的文档说明了返回值:
set方法应该返回一个布尔值。返回true表示分配成功。如果set方法返回false,并且赋值发生在严格模式代码中,则将抛出TypeError
示例代码显示了不同值的返回。代码使用,来处理返回的真实性。试试这个:
var myObject = {},
watchDog = new Proxy( myObject, {
set: function (target, key, value)
{
console.log(key, 'changed to ', value );
target[key] = value;
return Reflect.set(...arguments);
}
});
watchDog.test = 1;
欣赏快速的回答,但是代理是观察其他对象的变化。无论如何都尝试过,结果如下:TypeError:proxy上的“set”:trap为属性“test”返回了falsish。此外,无论如何,它是一个服务器代理而不是对象代理,如何创建和对象代理而不是服务器代理对象。返回反映…来自MDN示例,它是为解决一个
类型错误而构建的。我想我会马上得到它,谢谢耐心;-)Return true成功了。所以我需要使用代理来检测更改,而不是对象本身?现在我理解了“代理”这个名字(之前是watch或observe),但它不是watch,watchdog。我需要用它作为主要对象并返回这个看门狗对象,对吗?所以myObject只是一个容器,而watchDog是对象的管理器。那个那不一样。不可能只看变化而不包装它?听起来你走对了方向。Javascript不是我的强项,但据我所知,代理是最接近你想要的。嗨,Alex,它现在正在工作,谢谢你的帮助!你们知道为什么console.log(看门狗)会输出这么多http和path内容吗(请看我的问题)?你们能详细说明一下你们的情况吗?为什么您需要监视对象的更改,为什么您要更改myObject
,而不是watchDog
?这在代码中并不清楚。@estus:另请参见下面的答案和注释。我看到了。不清楚你为什么坚持看myObject而不是用watchDog。不可能观察更改而不是将其包装?可以用代理篡改原型链并监视myObject本身,但这可能会产生不良后果。这取决于这个物体是什么以及它是如何使用的。@estus,谢谢你的回答。我能记得观察从js中删除的内容。我使用myObject而不是Proxy,因为我了解过去,我认为它是一样的,但它不是。现在我明白了为什么它被称为代理,代理是对象的访问管理器,对象是保存信息的容器。我试图做的是使一个对象在初始化一次后无法更改。这正在工作。我错过了对象。观察,但仅此而已。是的,如果代理按原样工作,请不要进一步查看。唯一真正替代Object.observe的方法是轮询,它效率低下,而且是异步的。正如我所提到的,对于普通对象原型链,可以篡改,比如obj.\uuuuu proto\uuuu=newproxy({},…)
。如果一个对象不是简单的或有现有承诺,则可能无法按预期工作。