首页 > 解决方案 > 具有_任何可能的属性_的无限深度对象定义为既是又返回另一个无限深度对象的函数。JS

问题描述

我想创建一个具有以下两个属性的无限深度“任何东西”对象:

  1. 任何对象上的每个属性都是另一个任何对象。
  2. 任何对象上的每个属性也是一个返回任何对象的函数。

目的是在不需要更具体的模拟时简单地模拟测试中的对象。

属性 1 由如何通过 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

这可以在没有 Proxy 的 polyfill 的情况下在 ES5 中完成吗?

编辑:不是基本对象/函数链接如何在 javascript 中工作的副本. 我知道我可以将“this”从函数返回到链。问题是关于将所有可能的属性定义为“链”方法。那就是 p.whateverYouCanImagine() 返回 p 并且 p.anyOldPropertyName 作为属性访问返回 p 或者在这两种情况下都返回一个执行与 p 相同功能的新对象。不是链接,但某种形式的链接可以解决这个问题。困难/不同的部分是,在运行时我可以选择一个未写入对象的属性来访问,它应该仍然可以工作。

标签: javascriptmockingecmascript-5

解决方案


这是一个循环依赖:

const a = {};
a.a = a;

就是这样,这是一个无限对象,你可以用一个函数替换属性a来返回相同的对象


推荐阅读