BMi*_*ner 27 javascript getter setter node.js
如何在JavaScript中模拟PHP风格的__get()和__set()魔术getter/setter?很多人都说现在这是不可能的.我几乎可以肯定这是可能的,因为像nowjs(http://nowjs.com)这样的项目会做这样的事情.
我知道您可以使用get和set,但是当您不确定属性名称是什么时,这些不起作用.例如,如果您希望在创建新属性时执行事件处理程序,该怎么办?
我想做的例子:
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!
Run Code Online (Sandbox Code Playgroud)
(问题类似于以下问题:
)
编辑:看起来这个功能被称为"动态代理",应该出现在ECMAScript"Harmony"标准中(可能是ES6).你可以在这里阅读更多.一个新的"代理"对象引入了几个方法(即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)
Run Code Online (Sandbox Code Playgroud)
这里的底线:它在大多数浏览器中都不起作用,但Node.js的实现可用:node-proxy.
Dom*_*nic 13
通过nowjs源代码,我相信他们通过持续监视now
对象并在检测到客户端和服务器之间推送更改来实现此目的.但是我承认我还没有完全弄清楚他们的代码.
在浏览器中,这将通过一些有趣的setInterval
黑客来完成.
编辑:是的,这确实是他们所做的:客户的第368行now.js
.他们做了一些技巧,以便一旦检测到新属性,将来访问它就会被getter和setter捕获,但这些修改只能在每1000毫秒内完成setTimeout
.
在当前的JavaScript中,这是不可能的另一个证据是,ECMAScript Harmony的代理提议是明确设计的,以实现这样的场景,这意味着它们目前无法完成.最近的Mozilla浏览器有一个原型代理实现,如果可能就足够了.显然V8正在努力增加支持,这可能已经足够,这取决于最近V8 Node使用的版本.
EDIT2:哦,很酷,在服务器端显然nowjs确实使用代理!这可能意味着它们在Node中足够成熟以供您使用.在https://github.com/Flotype/now/blob/master/lib/proxy.js上查看他们的工作.或者只是这样做var Proxy = require("nodejs-proxy")
并希望他们遵循规范,以便您可以利用MDC和其他地方的文档.
归档时间: |
|
查看次数: |
10373 次 |
最近记录: |