所有属性的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

上一篇: JavaScript getter for all properties

下一篇: How to connect to sql server with impersonation?