【发布时间】:2018-08-12 23:46:52
【问题描述】:
编辑:它是一个对象代理,另见答案但是不明白为什么 console.log( watchDog ) 会产生这么多与 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.
所以这不是对象代理。如何创建对象代理而不是代理服务器对象?
另见
【问题讨论】:
-
你能详细说明你的情况吗?为什么您需要关注对象更改以及为什么要更改
myObject而不是watchDog?这在代码中并不清楚。 -
@estus :另请参阅下面的答案和 cmets。
-
我看到了。不清楚您为什么坚持观看 myObject 而不是使用 watchDog。 无法观察更改而不是包装它? 可以使用 Proxy 篡改原型链并观察 myObject 本身,但这可能会产生不良后果。这取决于这个对象是什么以及它是如何使用的。
-
@estus,感谢您的回复。好吧,我记得观察并观察哪些从 js 中删除。由于对过去的了解,我使用了 myObject 而不是代理,我认为它是相同的,但事实并非如此。现在我明白为什么叫proxy了,proxy是对象的访问管理器,而对象是保存信息的容器。我尝试做的是创建一个在初始化一次后无法更改的对象。这正在工作。
-
我想念 Object.observe,但仅此而已。是的,如果代理按原样工作,请不要再观望。 Object.observe 的唯一真正替代方案是轮询,它效率低下而且是异步的。正如我所提到的,对于普通对象的原型链可以被篡改,例如
obj.__proto__ = new Proxy({}, ...)。如果对象不是普通的或具有现有承诺,则可能无法按预期工作。
标签: javascript node.js object proxy