题
长话短说:我在一个情况下,我想PHP式吸气,但在JavaScript。
我JavaScript是在运行的火狐,因此Mozilla具体JS是确定由我。
只有这样我可以找到使JS吸气要求指定其姓名,但我喜欢定义为吸气 所有 可能名称。我不知道如果这是可能的,但是我非常想知道。
解决方案
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 /文档/网络/ JavaScript的/参考/ Global_Objects /代理
作品在铬,Firefox和node.js中缺点: - 刻着IE在IE浏览器无法正常工作。很快。
其他提示
你可以找到最接近的是 __noSuchMethod__ 时,这是JavaScript的等效PHP的__call的()。
不幸的是,没有__get / __集,这是一种耻辱,因为他们,我们可能已经实现__noSuchMethod__的相当,但用我还不明白的方式来实现的属性(如C#)__noSuchMethod __。
var foo = {
__noSuchMethod__ : function(id, args) {
alert(id);
alert(args);
}
};
foo.bar(1, 2);
如果您在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支持这两者。
Javascript1.5 不会有 吸气/器 语法糖.这是解释的非常好,约翰Resig 在这里,
这是不足够的通用对网络的使用,但肯定有Firefox他们(也犀牛,如果你想使用它的服务器上侧)。
如果你真的需要,工程实施中,你可以“欺骗”自己的方式以防万一通过测试对undefined
第二个参数,这也意味着你可以使用得到了实际设定的参数。
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;
}
}
};
如果你正在寻找的东西像PHP的的 __get()
功能,我不认为JavaScript提供任何这样的构建体中。
我能想到做的是通过对象的非功能部件循环并然后为每个创建一个相应的“getXYZ()”函数的最好的。
在躲闪伪ISH代码:
for (o in this) {
if (this.hasOwnProperty(o)) {
this['get_' + o] = function() {
// return this.o -- but you'll need to create a closure to
// keep the correct reference to "o"
};
}
}
我结束了使用nickfs的回答来构建自己的解决方案。我的解决方案会自动创建的get_ {} PROPNAME和set_ {} PROPNAME功能的所有属性。它检查功能附加在他们面前已经存在。这使您可以覆盖我们自己实现的默认get或set方法没有它覆盖掉的风险。
for (o in this) {
if (this.hasOwnProperty(o)) {
var creategetter = (typeof this['get_' + o] !== 'function');
var createsetter = (typeof this['set_' + o] !== 'function');
(function () {
var propname = o;
if (creategetter) {
self['get_' + propname] = function () {
return self[propname];
};
}
if (createsetter) {
self['set_' + propname] = function (val) {
self[propname] = val;
};
}
})();
}
}