gpt4 book ai didi

javascript - 监控所有 JavaScript 对象属性(magic getter 和 setter)

转载 作者:IT老高 更新时间:2023-10-28 22:02:22 60 4
gpt4 key购买 nike

如何在 JavaScript 中模拟 PHP 风格的 __get() 和 __set() 魔术 getter/setter?很多人说,目前这是不可能的。我几乎可以肯定这是可能的,因为像 nowjs ( http://nowjs.com ) 这样的项目会做这样的事情。

我知道您可以使用 getset ,但是当您不确定属性名称是什么时,这些不起作用。例如,如果您希望在创建新属性时执行事件处理程序

我想做的例子:

var obj = {};
notify(obj, function(key, value) {
//key is now the name of the property being set.
//value is the value of the property about to be set
console.log("setting " + key + " to " + value);
});
obj.foo = 2; //prints "setting foo to 2"
obj.bar = {a: 2}; //prints "setting bar to [Object]"
//Notice that notify() worked even though 'foo' and 'bar' weren't even defined yet!

(题型类似于下面的题:

)

编辑: 看起来这个功能被称为“动态代理”,应该出现在 ECMAScript“Harmony”标准(可能是 ES6)中。您可以阅读更多 here .使用几个方法(即 Create() 和 createFunction() )引入了一个新的“代理”对象。

可以这样做:

//Constructing an object proxy (proto is optional)
var proxy = Proxy.create(handler, proto);
proxy.foo = 2; //Triggers 'set' function in the handler (read about it)

这里的底线:它在大多数浏览器中不起作用,但 Node.js 有一个实现:node-proxy .

最佳答案

查看 nowjs 源代码,我相信他们通过持续监控 now 对象并在检测到它们时在客户端和服务器之间推送更改来做到这一点。不过,我承认我还没有完全理解他们的代码。

在浏览器中,这可以通过一些有趣的 setInterval hacks 来完成。

编辑:是的,他们确实是这样做的:line 368客户端 now.js。他们做some more tricks这样一旦检测到新属性,getter 和 setter 就会捕获对它的 future 访问,但这些修改仅在 setTimeout 中每 1000 毫秒进行一次。

另一个证明这在当前 JavaScript 中是不可能的证据是 the proxies proposal for ECMAScript Harmony被明确设计为启用此类场景,非常强烈地暗示它们目前无法完成。最近的 Mozilla 浏览器有 a prototype proxies implementation ,如果这可能就足够了。显然V8 is working to add support ,这可能就足够了,具体取决于这些天使用的 V8 Node 版本。

EDIT2:哦,酷,在 服务器 端,显然 nowjs 确实使用了代理!这可能意味着它们在 Node 中已经足够成熟,可以供您使用。在 https://github.com/Flotype/now/blob/master/lib/proxy.js 上查看他们的工作.或者只是执行 var Proxy = require("nodejs-proxy") 并希望他们遵循规范,以便您可以利用 MDC 和其他地方的文档。

关于javascript - 监控所有 JavaScript 对象属性(magic getter 和 setter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6985582/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com