我想创建一个具有以下两个属性的无限深度“任何”对象:
目的是在不需要更具体的模拟时,在测试中简单地模拟对象。
属性1由How do I make an object that has infinite depth through arbitrary properties in Javascript?完成,但它缺少属性2.出于运行时环境原因,解决方案必须在ES5中。
var p = infiniteDepthObject();
// All of the following should be defined for arbitrary property names at any depth
p.foo
p.foo.bar
p.foo().bar
p.foo().bar()
p.foo.bar()
p.foo.bar.baz
p.foo.bar.baz()
p.foo.bar().baz
p.foo().bar.baz
p.someOtherPropertyChosenAtRunTime()
... etc
这可以在没有代理的polyfill的情况下在ES5中完成吗?
编辑:不是How does basic object/function chaining work in javascript?的副本。我知道我可以将'this'从函数返回到链。问题是将所有可能的属性定义为“链”方法。那就是p.whateverYouCanImagine()返回p并且p.anyOldPropertyName作为属性访问返回p OR在两种情况下都返回一个执行与p相同功能的新对象。没有链接,但某种形式的链接可以解决这个问题。困难/不同的部分是,在运行时我可能会选择一个未写入对象的访问属性,它仍然可以工作。
这是循环依赖:
const a = {};
a.a = a;
这就是全部,这是一个无限的对象,您可以通过函数替换属性a以返回相同的对象