如何在JavaScript中模拟PHP风格的__get()和__set()魔术getter/setter?很多人说这是不可能的。但我几乎可以确定,因为像nowjs(http://nowjs.com)这样的项目就做到了这一点。
我知道你可以利用get和set,但当你不确定属性名时,这些方法无法使用。例如,如果您想要在创建新属性时执行事件处理程序怎么办?
以下是我想要实现的示例:
(问题类似于以下问题:)
我知道你可以利用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)中。您可以在此处阅读更多信息。引入了一个新的'Proxy'对象,并带有一些方法(例如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。