所有属性的 JavaScript getter

IT技术 javascript firefox getter
2021-02-05 02:20:55

长话短说:我想要一个 PHP 风格的 getter,但在 JavaScript 中。

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

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

6个回答

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。很快。

我承认这个问题的答案是正确的,但对于像我这样想要默认返回值的读者,请注意代理优先。
2021-03-14 02:20:55
但是如果我想模拟一个函数调用,比如 myProxy.foo('bar') 呢?我已经看到有申请函数但不允许使用自定义名称,总是在代理上执行:myProxy('bar'),我们可以用 myProxy('foo', 'bar') 模仿它,然后我们缺少神奇的东西
2021-03-30 02:20:55
@BarryMcNamara 你能澄清一下你的意思是代理优先吗?
2021-04-03 02:20:55
它也适用于 Edge。有关特定浏览器版本,请参阅caniuse.com
2021-04-05 02:20:55
@Enrique 如果您从 getter 返回一个函数,您绝对应该能够调用myProxy.foo('bar').
2021-04-09 02:20:55

如果你在 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 支持两者。

不需要在分配的代理中实现“设置”?
2021-03-22 02:20:55
^ 这是天才
2021-03-26 02:20:55
这是我找到的最好的答案。
2021-04-10 02:20:55
@Enrique 不,它像普通对象一样工作,但您可以定义它。
2021-04-10 02:20:55

您能找到的最接近的是__noSuchMethod__,它相当于 JavaScript 的 PHP __call()。

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

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

foo.bar(1, 2);
重要提示:链接现在说:此功能已过时。尽管它可能在某些浏览器中仍然有效,但不鼓励使用它,因为它可以随时被删除。尽量避免使用它。
2021-03-19 02:20:55
虽然noSuchMethod已被删除,但 ECMAScript 2015 (ES6) 规范具有 Proxy 对象,您可以使用它实现以下(以及更多)。
2021-03-26 02:20:55
noSuchMethod是非标准的,没有任何版本的 Internet Explorer 支持它,因此它可能不适用于您的许多用户的浏览器。
2021-03-31 02:20:55
@TowaProxy确实是未来。如果您在“about:flags”下启用了实验性 JavaScript 功能,它就可以在 Chrome 上使用。没有其他等价物__noSuchMethod__
2021-04-03 02:20:55
ECMAScript 对此的模拟怎么样?
2021-04-06 02:20:55

Javascript 1.5确实有getter/setter 语法糖John Resig here对此进行很好的解释

它对于 Web 使用来说不够通用,但 Firefox 肯定有它们(还有 Rhino,如果你想在服务器端使用它的话)。

不完全是 __get() 和 __set()。PHP 的版本让您可以监控所有属性,即使是尚未创建的属性。
2021-03-24 02:20:55

如果你真的需要一个有效的实现,你可以通过测试第二个参数来“欺骗”你的方式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;
        }
    }
};