有没有JavaScript的等价物来替代Python中的__getattr__方法?

38
在Python中,您可以定义一个具有__getattr__(self,key)方法的对象,以以程序化方式处理所有未知属性,但在JavaScript中,您只能为预定义属性定义getter和setter。是否存在一种通用方式,也可以在JavaScript中完成前面的事情?
示例代码可能如下:
function X() {};
X.prototype={
  __getattr__:function(attrname) {
    return "Value for attribute '"+attrname+"'";
  }
}

x=new X()
alert(x.lskdjoau); // produces message: "Value of attribute 'lskdjoau'"

关键点是根据属性名称以编程方式获取属性值。预设属性不起作用,因为在初始化过程中没有信息可供请求的属性。


作为一个来自Python背景的JavaScript新手,我所需要的是__getattr__对应的是myObj[myKey],而__hasattr__对应的是myObj.hasOwnProperty(myKey)。由于问题已关闭,我将此作为评论添加。 - Théo Rubenach
2个回答

67

如果您的浏览器支持ES6代理功能,现在可以实现。您可以在ECMAScript 6兼容性表中查看此功能是否被支持。

如果您有代理支持,则可以按以下方式使用它:

let handler = {
  get(target, name) {
    return `Value for attribute ${name}`
  }
}

let x = new Proxy({}, handler);
console.log(x.lskdjoau); // produces message: "Value of attribute 'lskdjoau'"

可以在chrome、firefox和node.js中使用。缺点:在IE中无法工作,该死的IE。不久之后。


天啊,我一直在等这个!!! - B T
看起来你已经打包好了。https://github.com/alexmojaki/sorcery#dict_of 做得好! - kzahel
我还不太清楚。有 JSFiddle 吗? - AhmedRana

11
很遗憾,答案是否定的。请参见Python 在 JavaScript 中的 __getattr__
你可以使用__defineGetter__,但是像你所提到的,你需要知道要访问的属性名称。
顺便说一下,我认为你是指__getattr____getitem__用于通过[]访问的对象)。

谢谢。是的,最好使用__getattr__。 - qweasd
6
@Roatin 为什么!!!JavaScript 需要这个功能比任何其他功能都更加迫切(除了那个人们已经请求了十年的“不那么糟糕”功能)。 - orokusaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接