【发布时间】:2011-10-22 13:41:16
【问题描述】:
如何在 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!
(题型类似于下面的题:
)
编辑: 看起来这个功能被称为“动态代理”,应该出现在 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。
【问题讨论】:
-
这个称为代理的功能是 ECMAScript 6 而不是 5 的一部分。
-
好收获。修改了我的帖子。谢谢!
标签: javascript node.js setter getter