代码之家  ›  专栏  ›  技术社区  ›  Luke Vo

在javascript中,是否可以创建具有动态(待定)属性/成员的对象?

  •  1
  • Luke Vo  · 技术社区  · 7 年前

    我尝试用javascript实现这一点:

    var a = new MyObj();
    console.log(a.Foo()); // Print Foo
    console.log(a["Bar"]()); // Print Bar
    

    基本上,我事先不知道所需的属性/成员名,但取决于我返回的调用,有点类似于c# ExpandoObject (动态)。

    是否可以在javascript中创建这样的对象?

    注:我知道有可能 添加 但是,在我的例子中,我不知道需要添加哪些属性。

    a.Foo = () => { return "Foo"; }
    

    这不可能,因为我不知道 Foo 需要。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Nina Scholz    7 年前

    你可以用一个 Proxy 只实现一个getter,方法是返回一个函数,该函数是键上的闭包。

    var a = new Proxy({ baz: 42 }, {
            get: function (target, prop, receiver) {
                return prop in target
                    ? () => target[prop]
                    : () => prop;
            }
        });
    
    console.log(a.Foo());    // Foo
    console.log(a["Bar"]()); // Bar
    console.log(a.baz());    // 42
        2
  •  0
  •   Akhil Aravind    7 年前

    对不起,我搞错了,现在看一看这个片段,希望这就是你要看的。

    你现在可以检查这个片段吗?

    let a = {}; // object
    a.Foo = ()=> {return 'foo'};
    a.Bar = ()=> {return 'bar'};
    
    a.address = {}; // object inside object
    a.address.houseno = '122';
    
    console.log(a.Foo()); // Print Foo
    console.log(a["Bar"]()); // Print Bar
    console.log(a.address.houseno)
        3
  •  -2
  •   ZER0    7 年前

    在现代浏览器中,你可以做到这一点。 Proxy :

    下面是一个实现您所描述内容的示例:

    const o = new Proxy({}, {
      get(obj, name) {
        return () => name
      }
    });
    

    在特定情况下,您没有要“代理”的原始对象,但您可能希望在上面的链接中阅读更多内容,以便添加您想要的所有陷阱。