javascript - 具有_任何可能的属性_的无限深度对象定义为既是又返回另一个无限深度对象的函数。JS
问题描述
我想创建一个具有以下两个属性的无限深度“任何东西”对象:
- 任何对象上的每个属性都是另一个任何对象。
- 任何对象上的每个属性也是一个返回任何对象的函数。
目的是在不需要更具体的模拟时简单地模拟测试中的对象。
属性 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 相同功能的新对象。不是链接,但某种形式的链接可以解决这个问题。困难/不同的部分是,在运行时我可以选择一个未写入对象的属性来访问,它应该仍然可以工作。
解决方案
这是一个循环依赖:
const a = {};
a.a = a;
就是这样,这是一个无限对象,你可以用一个函数替换属性a来返回相同的对象
推荐阅读
- python - python unittest类中的assertRaises
- r - 在 R 中使用 MODISTools 函数时“找不到对象 'rlang_hash'”
- amazon-web-services - 如何填充 DynamoDB 进行测试
- r - 如何将 foreach::foreach 更改为 R 中的简单循环
- bash - Shell 脚本 - 添加内存功能
- python-3.x - tkinter:scolledText 占用空间很小
- c++ - CGAL 中的 2D AABBTree 与自定义属性图
- pascal - 在 Pascal 中将 While Do 循环语句重写为 For Do 循环
- python - 可以将存储在 pandas 数据帧中的 SMILE 结构直接输入 RDKit 以计算分子指纹和相似度吗?
- c# - 如何将我的必应地图图像的屏幕截图复制到 Winforms 中的剪贴板?