【问题标题】:What data structure in JS would allows to choose one value from defined values?JS 中的什么数据结构允许从定义的值中选择一个值?
【发布时间】:2017-09-24 18:49:35
【问题描述】:

我想创建状态对象。可以有pendingsessionrejectedcancelled等值...

我想像status.isSession();status.isPending()...等一样访问它`

但我想这样分配它status.toPending();status.toSession();

这样就没有拼写错误的余地。

我认为这是动态规划。

【问题讨论】:

  • 您为什么需要以这种方式访问​​它。你不能只有例如status.get()status.set(status.inprogress)?
  • "如果我不必为每个状态分别定义函数,我对 status.session() 开放"你是什么意思? @FCin 的解决方案将允许您仅使用一个函数来实现此目的,您获取新状态并将其作为参数传递给 set,然后将该参数设置为 true 并将所有其他对象设置为 false。
  • 我更新了问题
  • @MuhammadUmer 更新问题的要求与原始问题文本的要求不同,是吗?见stackoverflow.com/help/how-to-ask
  • 不,我说清楚了

标签: javascript data-structures metaprogramming dynamic-programming


【解决方案1】:

您可以在 JavaScript 中实现这一点,但它只适用于双等号。

你可以像这样使用构造函数创建一个对象:

function Status(value){
  this.session = true;
  this.value = value;
}

现在如果你创建这个对象的一个​​实例:

const status = new Status('session');

果然status.session会返回true,status.value会返回'session'

现在您可以覆盖该对象的 toString() 方法,使其返回 status.value

Status.prototype.toString = function(){
  return this.value;
}

这样做的原因是,当您尝试比较 Object 与 Primitive 时,引擎会尝试将它们置于“值上下文”中,并通过调用 .toString() 操作将您的对象强制转换为 String。

果然这会产生:

const status = new Status('session');
console.log(status == 'session');

在您的控制台中为 true。

但这是非常不鼓励的,因为这是一种 hack,你可能会遇到奇怪的错误,所以我建议远离。

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2018-08-18
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多