所有属性的JavaScript getter

ara*_*ius 48 javascript getter firefox

长话短说:我的情况是我喜欢PHP式的getter,但是在JavaScript中.

我的JavaScript只在Firefox中运行,因此我可以使用Mozilla特定的JS.

我可以找到制作JS getter的唯一方法是需要指定它的名称,但是我想为所有可能的名称定义一个getter .我不确定这是否可行,但我非常想知道.

B T*_*B T 65

Proxy可以做到!我很高兴这存在!这里给出一个答案:是否有一个javascript相当于python的__getattr__方法?.用我自己的话来改写:

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"
Run Code Online (Sandbox Code Playgroud)

代理胜利!查看MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

适用于chrome,firefox和node.js. 缺点:在IE中不起作用 - freakin IE.不久.

  • @Enrique 如果你从 getter 返回一个函数,你绝对应该能够调用 `myProxy.foo('bar')`。 (3认同)

Ion*_*tan 47

你能找到的最接近的是__noSuchMethod__,这是JavaScript相当于PHP的__call().

不幸的是,没有等效的__get/__ set,这是一种耻辱,因为有了它们我们可以实现__noSuchMethod__,但我还没有看到使用__noSuchMethod__实现属性的方法(如在C#中).

var foo = {
    __noSuchMethod__ : function(id, args) {
        alert(id);
        alert(args);
    }
};

foo.bar(1, 2);
Run Code Online (Sandbox Code Playgroud)

  • __noSuchMethod__是非标准的,并且没有任何版本的Internet Explorer支持它,因此它可能无法在您的许多用户的浏览器上运行. (9认同)
  • **重要提示:**链接现在说:*此功能已过时.虽然它可能仍然适用于某些浏览器,但不鼓励使用它,因为它可以随时删除.尽量避免使用它.* (6认同)
  • 当__noSuchMethod__被删除时,ECMAScript 2015(ES6)规范具有Proxy对象,您可以使用它来实现以下(和更多). (5认同)
  • @Towa`Proxy`确实是未来.如果您在"about:flags"下启用实验性JavaScript功能,则可以在Chrome上使用它.`__noSuchMethod__`没有其他等价物. (4认同)
  • 那么ECMAScript模拟呢? (2认同)

Ali*_*Ali 28

如果您在ES6中编码,您可以将代理和类组合在一起,以获得像php这样漂亮的代码:

class Magic {
    constructor () {
        return new Proxy(this, this);
    }
    get (target, prop) {
        return this[prop] || 'MAGIC';
    }
}
Run Code Online (Sandbox Code Playgroud)

这绑定到处理程序,因此您可以使用此而不是目标.

注意:与PHP不同,代理处理所有属性请求.

let magic = new Magic();
magic.foo = 'NOT MAGIC';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC
Run Code Online (Sandbox Code Playgroud)

您可以检查哪些浏览器支持代理http://caniuse.com/#feat=proxy和类http://caniuse.com/#feat=es6-class.节点8支持两者.

  • 这是我找到的最好的答案。 (3认同)
  • ^这是天才 (2认同)

Jav*_*ier 5

Javascript 1.5确实有getter/setter 语法糖.John Resig 在这里解释得非常好

它对于网络使用来说不够通用,但Firefox当然也有它们(如果您想在服务器端使用它,也可以使用Rhino).

  • 不完全__get()和__set().PHP的版本允许您监视所有属性,甚至是尚未创建的属性. (5认同)

Ven*_*oth 5

如果你真的需要一个有效的实现,你可以通过测试第二个参数来"欺骗"你的方式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;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)