看起来不太可行或非常棘手,但我还是会尝试一下。
如何描述应该表示流畅(非预定义)结构配置节点的结构(对象/类)(即可以具有用户可能在此处放置的任何属性)
节点表示仍然应该在底层具有用于标准对象处理的自定义功能实现,即
toString
、valueOf
、toJSON
。
那么这三个(也许之前可能需要一些其他有用的东西)可以在某些符号级别或其他非公开可枚举属性的基础上实现,以便属性可用于数据内容本身吗?
例如配置结构可供用户输入为
configRoot:
fluentSubSection:
someProp: 12
valueOf: John Doe
toString: whatever
这样用户就不会受到任何属性保留字的限制 尽管如此,配置表示结构本身仍然会以自然的方式
const config = loadConfig('...')
console.log(config.configRoot.fluentSubSection.valueOf)
// John Doe - plain content data access
ConfigNode 实例本身应该具有一些自定义功能,如
console.log(String(config.configRoot.fluentSubSection))
// Should switch to some functional level access for toString
// E.g. [Custom ConfigNode - someProp: 12; valueOf: John Doe; toString: whatever]
挖掘符号和代理看起来对于分割功能和内容表示没有太大帮助。
无论如何,请提出任何想法。 谢谢
尚不完全清楚您想要实现什么,但很可能使提到的道具不可枚举,因此只需将它们定义为不可枚举即可。一般来说,组合
可以满足您可能遇到的任何疯狂场景。
class Sub{
constructor(privateProps){
for(const name in privateProps){
Object.defineProperty(this, name, {value: privateProps[name]});
}
}
toString(){
return 'whatever';
}
}
const configRoot = {
fluentSubSection: new Sub({
someProp: 12,
valueOf: 'John Doe'
})
};
console.log(configRoot.fluentSubSection);
console.log(configRoot.fluentSubSection.someProp, configRoot.fluentSubSection.valueOf);