JS 对象标准原型作为符号

问题描述 投票:0回答:1

看起来不太可行或非常棘手,但我还是会尝试一下。

如何描述应该表示流畅(非预定义)结构配置节点的结构(对象/类)(即可以具有用户可能在此处放置的任何属性)

节点表示仍然应该在底层具有用于标准对象处理的自定义功能实现,即

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]

挖掘符号和代理看起来对于分割功能和内容表示没有太大帮助。

无论如何,请提出任何想法。 谢谢

javascript serialization marshalling
1个回答
0
投票

尚不完全清楚您想要实现什么,但很可能使提到的道具不可枚举,因此只需将它们定义为不可枚举即可。一般来说,组合

  1. 对象.defineProperty
  2. 私人课道具
  3. 符号道具
  4. 代理
  5. 类 getter/setter(它们位于类的原型中)

可以满足您可能遇到的任何疯狂场景。

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);

© www.soinside.com 2019 - 2024. All rights reserved.