长话短说:我想要一个 PHP 风格的 getter,但在 JavaScript 中。
我的 JavaScript 仅在 Firefox 中运行,因此我可以使用 Mozilla 特定的 JS。
我能找到的制作 JS getter 的唯一方法需要指定其名称,但我想为所有可能的名称定义一个 getter 。我不确定这是否可能,但我非常想知道。
长话短说:我想要一个 PHP 风格的 getter,但在 JavaScript 中。
我的 JavaScript 仅在 Firefox 中运行,因此我可以使用 Mozilla 特定的 JS。
我能找到的制作 JS getter 的唯一方法需要指定其名称,但我想为所有可能的名称定义一个 getter 。我不确定这是否可能,但我非常想知道。
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 中不起作用 - 该死的 IE。很快。
如果你在 ES6 中编码,你可以结合代理和类来获得一个漂亮的代码,比如 php:
class Magic {
constructor () {
return new Proxy(this, this);
}
get (target, prop) {
return this[prop] || 'MAGIC';
}
}
this 绑定到处理程序,因此您可以使用 this 而不是 target。
注意:与 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和 class http://caniuse.com/#feat=es6-class。节点 8 支持两者。
您能找到的最接近的是__noSuchMethod__,它相当于 JavaScript 的 PHP __call()。
不幸的是,没有 __get/__set 的等价物,这是一种耻辱,因为有了它们我们可以实现 __noSuchMethod__,但我还没有看到使用 __noSuchMethod__ 实现属性的方法(如在 C# 中)。
var foo = {
__noSuchMethod__ : function(id, args) {
alert(id);
alert(args);
}
};
foo.bar(1, 2);
Javascript 1.5确实有getter/setter 语法糖。John Resig here对此进行了很好的解释
它对于 Web 使用来说不够通用,但 Firefox 肯定有它们(还有 Rhino,如果你想在服务器端使用它的话)。
如果你真的需要一个有效的实现,你可以通过测试第二个参数来“欺骗”你的方式undefined
,这也意味着你可以使用 get 来实际设置参数。
var foo = {
args: {},
__noSuchMethod__ : function(id, args) {
if(args === undefined) {
return this.args[id] === undefined ? this[id] : this.args[id]
}
if(this[id] === undefined) {
this.args[id] = args;
} else {
this[id] = args;
}
}
};