所有属性的JavaScript getter

问题描述 投票:43回答:7

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

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

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

javascript firefox getter
7个回答
60
投票

Proxy可以做到!我很高兴这存在!这里给出答案:Is there a javascript equivalent of python's __getattr__ method?。用我自己的话来改写:

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。不久。


48
投票

你能找到的最接近的是qazxsw poi,它是PHP的等效PHP __call()。

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

__noSuchMethod__

24
投票

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

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

foo.bar(1, 2);

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

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

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

您可以检查哪些浏览器支持代理let magic = new Magic(); magic.foo = 'NOT MAGIC'; console.log(magic.foo); // NOT MAGIC console.log(magic.bar); // MAGIC 和类http://caniuse.com/#feat=proxy。节点8支持两者。


5
投票

http://caniuse.com/#feat=es6-class确实有Javascript 1.5 getter/setter。 John Resig syntactic sugar解释得非常好

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


5
投票

如果你真的需要一个有效的实现,你可以通过测试qazxsw poi的第二个参数来“欺骗”你的方式,这也意味着你可以使用get来实际设置参数。

here

1
投票

如果你正在寻找像PHP的undefined函数,我不认为Javascript提供任何这样的结构。

我能想到的最好的事情是遍历对象的非函数成员,然后为每个成员创建相应的“getXYZ()”函数。

在狡猾的伪代码中:

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;
        }
    }
};

1
投票

我最终使用了nickfs的答案来构建我自己的解决方案。我的解决方案将自动为所有属性创建get_ {propname}和set_ {propname}函数。它确实在添加之前检查该函数是否已存在。这允许您使用我们自己的实现覆盖默认的get或set方法,而不会有被覆盖的风险。

__get()
© www.soinside.com 2019 - 2024. All rights reserved.