所有属性的JavaScript getter
长话短说:我处于一种我喜欢PHP风格的getter的情况,但在JavaScript中。
我的JavaScript只在Firefox中运行,所以Mozilla特定的JS对我来说可以。
我可以找到的唯一方法是创建一个JS getter,它需要指定它的名字,但是我想为所有可能的名称定义一个getter。 我不确定这是否可行,但我很想知道。
您可以找到最接近的__noSuchMethod__,它是PHP的__call()的等价物。
不幸的是,没有相当于__get / __ set,这是一个耻辱,因为他们可以实现__noSuchMethod__,但我还没有看到使用__noSuchMethod__实现属性(如在C#中)的方法。
var foo = {
__noSuchMethod__ : function(id, args) {
alert(id);
alert(args);
}
};
foo.bar(1, 2);
Proxy
可以做到这一点! 我很高兴这存在! 答案在这里给出:是否有python的__getattr__方法的JavaScript等价物? 。 用我自己的话来重述:
var x = new Proxy({},{get(target,name) {
return "Its hilarious you think I have "+name
}})
console.log(x.hair) // logs: "Its hilarious you think I have hair"
代理赢得胜利! 查看MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
适用于chrome,firefox和node.js. 缺点:在IE中不起作用 - freakin IE。 不久。
如果你在ES6编码,你可以结合使用代理和类来获得一个漂亮的代码,如php :
class Magic {
constructor () {
return new Proxy(this, this);
}
get (target, prop) {
return this[prop] || 'MAGIC';
}
}
这绑定到处理程序,所以你可以使用这个而不是目标。
注意:与PHP不同,代理处理所有的属性请求。
let magic = new Magic();
magic.foo = 'NOT MAGIC';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC
您可以查看哪些浏览器支持代理http://caniuse.com/#feat=proxy和类http://caniuse.com/#feat=es6-class。 节点8同时支持。
链接地址: http://www.djcxy.com/p/74083.html