如何在 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)中。您可以在此处阅读更多内容。一个新的“代理”对象被引入了几个方法(即 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。