Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:为具有代理的对象创建看门狗_Javascript_Node.js_Object_Proxy - Fatal编程技术网

Javascript Node.js:为具有代理的对象创建看门狗

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)

编辑:它是一个对象代理,也可以看到答案,但是我不理解为什么console.log(看门狗)会产生这么多http和路径相关的东西,不理解它们之间的关联


我想关注对象的变化,但是代理对象似乎是代理服务器对象

我是如何测试该功能的:

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({},…)
。如果一个对象不是简单的或有现有承诺,则可能无法按预期工作。